三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
Ken3三流君の連絡先:
[google formsで連絡する]
上記の問い合わせフォームに質問・感想など気軽に書き込んでください

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

XXXXXXさんへ Excel VBA コードを VBSで動作させる時にエラーが発生する件

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


質問・感想・クレームなど、
気軽にコメント欄に書いてもらえるとうれしいです。

[Googleフォームにコメントを残す]
↑質問・コメントの入力フォームです、気軽に書いてください


フッター:最後にKen3Videoの動画一覧を紹介します

YouTubeにアップした動画です。他の動画を一瞬でも見てもらえるとさらに嬉しいです。
再生リスト:[三流君Ken3の最新動画]←リストの一覧形式で表示する


また、ブログを見に来てくださいね。ではまたぁ~