Excel VBA を VBS に変換する作業中に
「オブジェクトでサポートされていないプロパティまたはメソッドです」
エラーが発生しました。
と
質問をいただきました。
ここから下質問文※一部カット
VBAで無事複数メール送信の構文が出来ました。
そして、一番の難題であるVBSへの変換ですが、
まず私はVBAのマクロをこう作りました。
Enum 列
宛先 = 1
氏名
成績
件名
添付ファイル1
添付ファイル2
添付ファイル3
End Enum
Sub メール作成()
Dim ol As New Outlook.Application
Dim m As mailItem
Dim MaxRow: MaxRow = Range("A1").End(xlDown).Row
For i = 2 To MaxRow
Set m = ol.CreateItemFromTemplate("c:\work\test.oft")
m.To = Cells(i, 列.宛先).Value
m.Subject = Cells(i, 列.件名).Value
m.Attachments.Add "c:\work\" & Cells(i, 列.添付ファイル1).Value
m.Attachments.Add "c:\work\" & Cells(i, 列.添付ファイル2).Value
m.Attachments.Add "c:\work\" & Cells(i, 列.添付ファイル3).Value
m.HTMLBody = Replace(m.HTMLBody, "□□", Cells(i, 列.氏名).Value)
m.HTMLBody = Replace(m.HTMLBody, "●●", Cells(i, 列.成績).Value)
m.SaveAs "c:\work\" & Cells(i, 列.氏名).Value & ".msg"
Next i
End Subこれで無事動きます。
さて、これをVBSに変換します。
Option Explicit
Dim ex, bk, m, ol, sh
Set ex = GetObject(,"Excel.Application")
Set bk = ex.Workbooks(1)
Set sh = CreateObject("Outlook.Application")
For i = 2 To sh.Range("A1").End(-4121).Row
Set m = ol.CreateItemFromTemplate("C:\work\test.oft")
m.TO = sh.Cells(i,"A").Value
m.Subject = sh.Cells(i,"D").Value
m.Attachments.Add "C:\work\" & sh.Cells(i,"E").Value
m.Attachments.Add "C:\work\" & sh.Cells(i,"F").Value
m.Attachments.Add "C:\work\" & sh.Cells(i,"G").Value
m.HTMLBody = Replace(m.HTMLBody,"□□", sh.Cells(i,"B").Value)
m.HTMLBody = Replace(m.HTMLBody,"●●", sh.Cells(i,"C").Value)
m.SaveAs"C:\work\" & sh.Cells(i,"G").Value & ".msg"
Set m = Nothing
Next
ol.Quit
Set ol = Nothing
MsgBox("Finished!")と助言頂きました。
何度やっても、For i = 2 To sh.Range("A1").End(-4121).Row
の部分で「オブジェクトでサポートされていないプロパティまたはメソッドです」と
出てしまいます。
- 4121の変換も今一つ理解出来ないのですが、ご返答頂けると幸いです(><)
1.定数 xlDownを疑う
元のVBAは
Dim MaxRow: MaxRow = Range("A1").End(xlDown).Row
For i = 2 To MaxRow
エラーの場所VBS:
For i = 2 To sh.Range("A1").End(-4121).Row
なので、初見は-4121
xlDown の定数・値 を 素直に疑う
が
Excelで値を見てみると、
xlDown = -4121であっているみたいです。
定数の確認方法は、下記の動画を見てください。
【VBS】VBSでExcelの定数xlDownなどを使う方法 例.End(xlDown).Rowで最終行【三流君】 - YouTube
www.youtube.com
2.エラーは意外なミス?単純ミス?
「オブジェクトでサポートされていないプロパティまたはメソッドです」
なので
sh.Range("A1").End(-4121).Row
sh.
ん?
単純ミス?かも?
>Set bk = ex.Workbooks(1)
>
>Set sh = CreateObject("Outlook.Application")
>
>For i = 2 To sh.Range("A1").End(-4121).Row
参考にしたVBS作成者の気持ちになると※気持ちは関係ないか
bkがブック
shがシート
なので、
For i = 2 To sh.Range("A1").End(-4121).Row
2からsh.RangeシートのA1の最後の行を判断
としたいのに、
元のshが
>Set sh = CreateObject("Outlook.Application")
と
shのさしているのが、Outlook.Applicationになっている。
パターンだとshはシートなので
VBA最初の一歩(その5)変数と宣言:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
みたいに
[シート]
Set Sh = ActiveWokrbook.Worksheets("Sheet1")
Set Sh = Wb.Worksheets("Sheet1") 'ブックを参照する変数を用いた場合
Set Sh = Worksheets("sheet1") 'シート名による特定
Set Sh = Worksheets(1) 'インデックスによる特定
Set Sh = Sheet1 'コード名(オブジェクト名)による特定
あら シートの変数名ws派も多いですね
Office TANAKA - VBAの変数[Setを使うケース]
そんな余談は置いといて、
なので
>Set sh = CreateObject("Outlook.Application")
が
Set sh = bk.Worksheets("Sheet1") 'ブックを参照する変数を用いた場合
bkがブックなので、
sh = bk.Worksheets("Sheet1")でブックのシート1とか設定すると、
For i = 2 To sh.Range("A1").End(-4121).Row
2からsh.RangeシートのA1の最後の行を判断
が
通るかも。
以上、単純ミスを疑ってみました。
あとは、パターン的に
>Set sh = CreateObject("Outlook.Application")
が
ol
Set ol = CreateObject("Outlook.Application")
を追加するのかな?
Option Explicit Dim ex, bk, m, ol, sh Set ex = GetObject(,"Excel.Application") '開いているExcel Set bk = ex.Workbooks(1) 'ブック Set sh = bk.Worksheets(1) 'シートを指定 Set ol = CreateObject("Outlook.Application") '変数olで For i = 2 To sh.Range("A1").End(-4121).Row 'シート最後までループ
一か所 予想しただけで、まだまだあるかもしれませんが、
解決の糸口となれば幸いです。 三流プログラマー Ken3