Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3430 / 13645 ツリー ←次へ | 前へ→

【62268】VBSからマクロの呼び出し さくら 09/7/6(月) 10:21 質問[未読]
【62272】Re:VBSからマクロの呼び出し kanabun 09/7/6(月) 11:16 発言[未読]
【62274】Re:VBSからマクロの呼び出し さくら 09/7/6(月) 11:43 発言[未読]
【62276】Re:VBSからマクロの呼び出し kanabun 09/7/6(月) 12:03 発言[未読]
【62278】Re:VBSからマクロの呼び出し さくら 09/7/6(月) 13:08 発言[未読]
【62280】Re:VBSからマクロの呼び出し kanabun 09/7/6(月) 14:04 発言[未読]
【62281】Re:VBSからマクロの呼び出し さくら 09/7/6(月) 14:30 発言[未読]
【62282】Re:VBSからマクロの呼び出し kanabun 09/7/6(月) 15:06 発言[未読]
【62284】Re:VBSからマクロの呼び出し さくら 09/7/6(月) 15:28 発言[未読]
【62285】Re:VBSからマクロの呼び出し kanabun 09/7/6(月) 15:55 発言[未読]
【62287】Re:VBSからマクロの呼び出し さくら 09/7/6(月) 16:35 発言[未読]
【62286】Re:VBSからマクロの呼び出し kanabun 09/7/6(月) 16:25 発言[未読]
【62288】Re:VBSからマクロの呼び出し さくら 09/7/6(月) 16:54 お礼[未読]
【62289】Re:VBSからマクロの呼び出し kanabun 09/7/6(月) 17:21 発言[未読]

【62268】VBSからマクロの呼び出し
質問  さくら  - 09/7/6(月) 10:21 -

引用なし
パスワード
   こんにちは。お力をお貸しください。

該当セルがws2.Cells(2, 4)の値より大きくws2.Cells(3, 4)の値より小さいときに
発動するマクロを作成しました。
以下で望むとおりの結果が得られたのですが、VBSから呼び出して
このマクロを走らせたときにワークシート関数でとまってしまいます。
代替案や、ヒント等ございましたらどうぞよろしくお願いいたします。


Public ws0 As String
Public ws1, ws2 As Worksheet

Public i, k As Integer

Public Sub before()

ws0 = Year(Date) & Right("0" & Month(Date), 2)
Set ws1 = ThisWorkbook.Worksheets(ws0)
Set ws2 = ThisWorkbook.Worksheets("日付")

For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
  If Application.WorksheetFunction.And(ws1.Cells(i, 1) > ws2.Cells(2, 4), ws1.Cells(i, 1) < ws2.Cells(3, 4)) = True Then
    MsgBox ws1.Cells(i, 1).Value
  End If
Next i

For k = 1 To Range("b" & Rows.Count).End(xlUp).Row
  If Application.WorksheetFunction.And(ws1.Cells(k, 2) > ws2.Cells(2, 4), ws1.Cells(k, 2) < ws2.Cells(3, 4)) = True Then
    MsgBox ws1.Cells(k, 2).Value
  End If
Next k


End Sub

【62272】Re:VBSからマクロの呼び出し
発言  kanabun  - 09/7/6(月) 11:16 -

引用なし
パスワード
   ▼さくら さん:
こんにちは。

>以下で望むとおりの結果が得られたのですが、VBSから呼び出して

VBSから呼び出す前に、そのVBAの構文、ちょっとおかしいですよ。
まず、それを直しておきましょう。

(1)とくに必要がない限り、変数はプロシージャ内に宣言する
 というのは↓の部分です。
>Public ws0 As String
>Public ws1, ws2 As Worksheet
>Public i, k As Integer

 5つの変数が、モジュールレベル(広域)変数として宣言してありますが、
 Sub before()
 というプロシージャ(ひとつのマクロのこと)の中でしか使わないのであれば
 それらの変数はプロシージャ内に宣言して使ったほうが管理しやすい。

(2)変数のデータ型は 変数ごとに宣言すること
>  ws1, ws2 As Worksheet
>  i, k As Integer
というのは、

   ws1 As Variant, ws2 As Worksheet
   i As Variant, k As Integer

というのと同じこと。
上のWorkbook変数は Sub before() プロシージャの最初に
  Dim ws1 As Worksheet, ws2 As Worksheet
と宣言してください。

(3)下の整数型ワーク変数は シートの行を格納する予定があるので、Integer
  でなく、Long型で宣言してください。
  Dim i As Long, k As Long

(4)↓は 
>ws0 = Year(Date) & Right("0" & Month(Date), 2)
    ↓
ws0 = Format$(Date, "yyyyMM")
とも書けますね?
 (どちらでも構いませんが)

(5)WorksheetFunction.And 構文を VB(A) の And構文 に直してください
>  If Application.WorksheetFunction.And(ws1.Cells(i, 1) > ws2.Cells(2, 4), ws1.Cells(i, 1) < ws2.Cells(3, 4)) = True Then
>    MsgBox ws1.Cells(i, 1).Value
>  End If

まずは、こんなところで、 VBAでの構文チェックを実行してください。

【62274】Re:VBSからマクロの呼び出し
発言  さくら  - 09/7/6(月) 11:43 -

引用なし
パスワード
   ありがとうございます!

>VBSから呼び出す前に、そのVBAの構文、ちょっとおかしいですよ。
>まず、それを直しておきましょう。

連ねた変数は同じ宣言になると思っていたのですが、違うのですね…
お恥ずかしいです。

ご指摘の部分を編集してみたのですが、VBSで呼び出すとやはり同じところで
「型が違います」とエラーが帰ってきます。

構文チェックとは、デバックのVBAコンパイルからでいいのですよね?
これでは何のエラーもありませんでした。

引き続きご指南いただけると助かります。

Public Sub before()

Dim ws0 As String
Dim ws1 As Worksheet, ws2 As Worksheet
Dim i As Long, k As Long

ws0 = Format$(Date, "yyyyMM")
Set ws1 = ThisWorkbook.Worksheets(ws0)
Set ws2 = ThisWorkbook.Worksheets("日付")

For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
  If ws1.Cells(i, 1) > ws2.Cells(2, 4) And ws1.Cells(i, 1) < ws2.Cells(3, 4) Then
    MsgBox ws1.Cells(i, 1).Value
  End If
Next i

For k = 1 To Range("b" & Rows.Count).End(xlUp).Row
  If ws1.Cells(k, 2) > ws2.Cells(2, 4) And ws1.Cells(k, 2) < ws2.Cells(3, 4) Then
    MsgBox ws1.Cells(k, 2).Value
  End If
Next k


End Sub

【62276】Re:VBSからマクロの呼び出し
発言  kanabun  - 09/7/6(月) 12:03 -

引用なし
パスワード
   ▼さくら さん:

>ご指摘の部分を編集してみたのですが、VBSで呼び出すとやはり同じところで
>「型が違います」とエラーが帰ってきます。

> 構文チェックとは、デバックのVBAコンパイルからでいいのですよね?
> これでは何のエラーもありませんでした。

そうです。VBAの構文的に問題がなくても、
実行時エラーという別のエラーがあります。

とりあえず、今のコードでは Rangeの親シートの指定がないですよね?
マクロを標準モジュールに書いておいて、そこで
親シートの指定を省略すると、ActiveSheetが親シートという解釈が
Excelによってなされますので、そこはプログラムのほうからどのシートの
範囲かを明示しないとまずいですよ

それから、構文エラーでなくても、Loopのなかで セルのプロパティに
何度もアクセスするのは 非効率なので、Loopに入る前に それ用の変数に
値をコピーしておいて、その変数の値と比較するようにします。
ws1.Range("D2").Value などがどのような値か分からないので
↓のサンプルでは Date型の値が入っているものと仮定して書いています。

 これをVBSから呼び出したら、どうなりますか?
 結果をお知らせください。

Public Sub Before()
 Dim ws0 As String
 Dim ws1 As Worksheet, ws2 As Worksheet
 Dim i As Long, k As Long
 Dim date1 As Date 'Double
 Dim date2 As Date 'Double
 
 ws0 = Format$(Date, "yyyyMM")
 Set ws1 = ThisWorkbook.Worksheets(ws0)
 Set ws2 = ThisWorkbook.Worksheets("日付")
 date1 = ws1.Range("D2").Value 
 date2 = ws1.Range("D3").Value
 
 Dim c As Range
 For Each c In ws2.Range("A1", ws2.Cells(ws2.Rows.Count, 1).End(xlUp))
   Select Case c.Value
    Case date1 To date2
      MsgBox c.Value
   End Select
 Next

End Sub

【62278】Re:VBSからマクロの呼び出し
発言  さくら  - 09/7/6(月) 13:08 -

引用なし
パスワード
   ありがとうございます。
わかりやすいご指南助かります。

>とりあえず、今のコードでは Rangeの親シートの指定がないですよね?ws2.Cells(2, 4)

このws2の部分で指定しているつもりでしたが不十分だったということでしょうか…。
初歩的な話だったら大変申し訳ありません。

ws1とws2が入れ替わっているようだったので、
その辺を弄って、いただいた構文で試してみました。

この過程で気づいたのですが
ws2.Range("D3").Value にはworkday関数を使用しておりまして、
vbsで呼び出した場合はここが計算できておらず、
その結果「型が違う」とエラーが出ているようです(当り前ですね…)

workday関数を使用している理由は
今日の時間外から翌営業日の朝9時までに当てはまるものを拾いたいからなんですが
workday関数を使わずにマクロだけで処理するしかないでしょうか…


  Public Sub Before2()
   Dim ws0 As String
   Dim ws1 As Worksheet, ws2 As Worksheet
   Dim i As Long, k As Long
   Dim date1 As Date
   Dim date2 As Date 'Double
  
   ws0 = Format$(Date, "yyyyMM")
   Set ws1 = ThisWorkbook.Worksheets(ws0)
   Set ws2 = ThisWorkbook.Worksheets("日付")
   date1 = ws2.Range("D2").Value
   date2 = ws2.Range("D3").Value
  
   Dim c As Range
   For Each c In ws1.Range("A1", ws1.Cells(ws1.Rows.Count, 1).End(xlUp))
     Select Case c.Value
      Case date1 To date2
        MsgBox c.Value
     End Select
   Next
  
  End Sub

【62280】Re:VBSからマクロの呼び出し
発言  kanabun  - 09/7/6(月) 14:04 -

引用なし
パスワード
   ▼さくら さん:


>この過程で気づいたのですが
>ws2.Range("D3").Value にはworkday関数を使用しておりまして、
>vbsで呼び出した場合はここが計算できておらず、
>その結果「型が違う」とエラーが出ているようです(当り前ですね…)

さくらさん、こちら「???」です。。

>workday関数を使わずにマクロだけで処理するしかないでしょうか…

VBSからでなく、Excelを起動してそのBookを開いて、
マクロ「Before2」を実行するとどうなりますか?

>  Public Sub Before2()
>   Dim ws0 As String
>   Dim ws1 As Worksheet, ws2 As Worksheet
>   Dim i As Long, k As Long
>   Dim date1 As Date
>   Dim date2 As Date 'Double
>  
>   ws0 = Format$(Date, "yyyyMM")
>   Set ws1 = ThisWorkbook.Worksheets(ws0)
>   Set ws2 = ThisWorkbook.Worksheets("日付")
>   date1 = ws2.Range("D2").Value
>   date2 = ws2.Range("D3").Value
>  
>   Dim c As Range
>   For Each c In ws1.Range("A1", ws1.Cells(ws1.Rows.Count, 1).End(xlUp))
>     Select Case c.Value
>      Case date1 To date2
>        MsgBox c.Value
>     End Select
>   Next
>  
>  End Sub

直接 Excel上で そのマクロを実行できるのなら、
分析ツール関数を使っているか、いないかは、関係ないと思います。

>「型が違う」とエラーが出ているようです

型が違うというのは 参照しているシートの [D2] や [D3]セルに
エラー値が入っているとかではないですか?

シート「日付」の[D2] や [D3]セルに日付データが(計算で、数式で)
正しく代入されていれば、

>  Public Sub Before2()
>   Dim ws0 As String
>   Dim ws1 As Worksheet, ws2 As Worksheet
>   Dim i As Long, k As Long
>   Dim date1 As Date
>   Dim date2 As Date
> 
>   ws0 = Format$(Date, "yyyyMM")
>   Set ws1 = ThisWorkbook.Worksheets(ws0)
>   Set ws2 = ThisWorkbook.Worksheets("日付")
>   date1 = ws2.Range("D2").Value
>   date2 = ws2.Range("D3").Value
> 
>   Dim c As Range
>   For Each c In ws1.Range("A1", ws1.Cells(ws1.Rows.Count, 1).End(xlUp))
>     Select Case c.Value
>      Case date1 To date2
>        MsgBox c.Value
>     End Select
>   Next
> 
>  End Sub

は何の不具合もなく動きます。
また、どのように VBS のコードを書かれているのか分かりませんが、
VBSから このBookをOpenして Before2 をRUNさせても、正しく実行されますよ

【62281】Re:VBSからマクロの呼び出し
発言  さくら  - 09/7/6(月) 14:30 -

引用なし
パスワード
   excelから起動してマクロを実行すれば普通に動きます。
[D3]セルには以下の関数が入っています。
VALUE(TEXT(WORKDAY(DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY())),1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")
[A2:A256]部分には今年度の休日が入っております。

excelから起動した場合は問題なく、
翌営業日付+9:00が[D3]に入っております。

これが、VBSから起動した場合は
[D3]セルが[#NAME?]になっており、マクロもエラーが出る状態です。

ちなみに参考までにVBSは以下の通りです。
dim exlApp
On Error Resume Next
set exlApp = createobject("Excel.Application")
exlApp.visible = true
exlApp.Workbooks.Open "\\00.00.00.00\**\**.xls"
exlApp.run "before"
If Err Then
WScript.Quit
End IF
If Not(exlApp Is Nothing) Then
exlApp.Quit
set exlApp = nothing
End If

【62282】Re:VBSからマクロの呼び出し
発言  kanabun  - 09/7/6(月) 15:06 -

引用なし
パスワード
   ▼さくら さん:

>exlApp.Workbooks.Open "\\00.00.00.00\**\**.xls"
すみません。ネットワーク環境がないので、↑ちょっと分かりません。

>excelから起動してマクロを実行すれば普通に動きます。
>[D3]セルには以下の関数が入っています。
>VALUE(TEXT(WORKDAY(DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY())),1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")
>[A2:A256]部分には今年度の休日が入っております。
これ、どこか他のセルに( たとえば[D1]セルに ) =TODAY() と書いておけば、
式は
  =VALUE(TEXT(D1,1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")
だけで済むのではないかしら?
(ま、本題とは関係ないことでしょうが)


>excelから起動した場合は問題なく、
>翌営業日付+9:00が[D3]に入っております。

なのに、

>これが、VBSから起動した場合は
>[D3]セルが[#NAME?]になっており、マクロもエラーが出る状態です。

であれば、問題なく動くexcelと VBSから起動したexcelがちがう、という
こと、考えられませんか?

OpenするBookの <Before> マクロに ◆部分を追加してみて、
もういちどVBSを走らせ
CreateObject("excel.application")
でどのExcelが起動しているのか、確かめてもらえませんか?

Public Sub Before()
 Dim ws0 As String
 Dim ws1 As Worksheet, ws2 As Worksheet
 Dim i As Long, k As Long
 Dim date1 As Date
 Dim date2 As Date

 MsgBox Application.Path, , Application.Version '◆追加
 
 ws0 = Format$(Date, "yyyyMM")
 Set ws1 = ThisWorkbook.Worksheets(ws0)
 Set ws2 = ThisWorkbook.Worksheets("日付")
 date1 = ws2.Range("D2").Value
 date2 = ws2.Range("D3").Value

 Dim c As Range
 For Each c In ws1.Range("A1", ws1.Cells(ws1.Rows.Count, 1).End(xlUp))
   Select Case c.Value
    Case date1 To date2
      MsgBox c.Value
   End Select
 Next

End Sub

【62284】Re:VBSからマクロの呼び出し
発言  さくら  - 09/7/6(月) 15:28 -

引用なし
パスワード
   何度もお手数をおかけします。

>>exlApp.Workbooks.Open "\\00.00.00.00\**\**.xls"
>すみません。ネットワーク環境がないので、↑ちょっと分かりません。
こちらは、たまたまネットワーク上にエクセルファイルが置いてあっただけで、
exlApp.Workbooks.Open "c:\**.xls"
Cドライブ直下に移動させて上記でも構いません。
オープンするファイルパスを指定しているだけ…ですが、
すみませんぼかし方がわかりにくかったですね。

>これ、どこか他のセルに( たとえば[D1]セルに ) =TODAY() と書いておけば、
>式は
>  =VALUE(TEXT(D1,1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")
>だけで済むのではないかしら?
>(ま、本題とは関係ないことでしょうが)
workday関数だと、祝日や特別休暇以外は記入しなくても、
土日は勝手に休日として扱ってくれるため利用しております。
確かにA2〜A256に土日を含めた全ての休日を入れていれば、それでも代用可能かと思います。
ただそうすると毎年土日含めてデータを作らないとなので…。

バージョンはexcelから立ち上げた場合もvbsから立ち上げた場合も11.0となりました。

ここからはVBA質問箱とは趣旨がずれてしまうのですが…
VBS側を以下のようにして、分析ツールのリフレッシュを行えば、
workday関数がエラーになりません。
ただし、このままではマクロが動いてくれません。

Option Explicit
Const cnsBook = "c:\**.xls"
Const strProcName = "before"
dim xlApp,xlBook

Set xlApp = CreateObject("Excel.Application")
' 本スクリプトファイルのフォルダ名の取得

'アドインリフレッシュ
Call AddinRefresh(xlApp,"分析ツール")

xlApp.Visible = True

Set xlBook = xlApp.Workbooks.Open(cnsBook, False, True)
    xlApp.Run strProcName '現在これがうまく作動しません
    xlApp.Quit 'こちらは動きます
Set xlBook = Nothing
Set xlApp = Nothing

Private Sub AddinRefresh(inXlsApp,inAddinName)
On Error Resume Next
inXlsApp.AddIns(inAddinName).Installed = False
inXlsApp.AddIns(inAddinName).Installed = True
End Sub

WORKDAY関数を削除して、毎年土日を自動的に取得するように作るほうが楽かもしれませんね…。

【62285】Re:VBSからマクロの呼び出し
発言  kanabun  - 09/7/6(月) 15:55 -

引用なし
パスワード
   ▼さくら さん:
>
>>>exlApp.Workbooks.Open "\\00.00.00.00\**\**.xls"
>>すみません。ネットワーク環境がないので、↑ちょっと分かりません。
>こちらは、たまたまネットワーク上にエクセルファイルが置いてあっただけで、
>exlApp.Workbooks.Open "c:\**.xls"
>Cドライブ直下に移動させて上記でも構いません。

>>これ、どこか他のセルに( たとえば[D1]セルに ) =TODAY() と書いておけば、
>>式は
>>  =VALUE(TEXT(D1,1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")
>>だけで済むのではないかしら?

わ〜〜、式まちがいでした。
こういう提案をしただけです。
  =VALUE(TEXT(WORKDAY(D1,1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")
どうもすみません。

>'アドインリフレッシュ
>Call AddinRefresh(xlApp,"分析ツール")
↑ この一行をいれないと [D2:D3]セルが #NAME になるのですか?

変ですね?

こちらでも VBSから呼び出してみましたけど、
Excel上で直接RUNさせたとき同様、エラーなく走りましたよ。

さくら.vbs
'------------------------------------------------
Dim xlApp
Dim xlBook
Dim strExcelBook
Dim strProcName

'変数定義
  strExcelBook = "D:\(Data)\さくら_テストデータ.xls"
  strProcName = "Before"
    
  Set xlApp = CreateObject("Excel.Application")
  xlApp.Visible = true
  Set xlBook = xlApp.Workbooks.Open(strExcelBook)
  xlApp.Run strProcName
  xlApp.Quit
  Set xlBook = Nothing
  Set xlApp = Nothing
'------------------------------------------------

【62286】Re:VBSからマクロの呼び出し
発言  kanabun  - 09/7/6(月) 16:25 -

引用なし
パスワード
   ▼さくら さん:

>VBS側を以下のようにして、分析ツールのリフレッシュを行えば、
>workday関数がエラーになりません。

たしかに、他の掲示板にそんなことが書いてありますね(^^
>分析ツールのリフレッシュを行えば
数式エラーにならないのであれば、そのようにしたらいかがでしょう?
(こちらでは VBSから呼び出してもエラーが出ないので、もう
検証のしようがありません (-_-)

>ただし、このままではマクロが動いてくれません。
>    xlApp.Run strProcName '現在これがうまく作動しません

これがまた、よくわからないです。
<Before>マクロは 標準モジュールに書いてあるんですよね?
念のために Book名も含めてマクロ名を指定してみるとか?
  xlApp.Run "Book名.XLM!Before"

【62287】Re:VBSからマクロの呼び出し
発言  さくら  - 09/7/6(月) 16:35 -

引用なし
パスワード
   返答ありがとうございます。

>こういう提案をしただけです。
>  =VALUE(TEXT(WORKDAY(D1,1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")
>どうもすみません。
そうですね、こちらのほうが簡潔でわかりやすいです。
ご指摘ありがとうございます。

[D2]には以下の式が入っており、#NAMEにはなりません。
またこの日付シートにはd1〜d3、A2〜(休日設定部分)
以外には何も入っておりません。

[D2]
VALUE(TEXT(TODAY(),"yyyy/mm/dd")&" 17:30")
[D3]
VALUE(TEXT(WORKDAY(D1,1,$A$2:$A$256),"yyyy/mm/dd")&" 09:00")

マクロはbeforeのみで、
ここにコピーしたのとなんら違いはありません。
(特に隠すべき部分もなかったので、本当にそのままです)
VBSもファイルパス以外はまったく同じです。

この状態で以下のVBSを走らせると、やはりエクセルが立ち上がった後
[D3]が#NAMEとなり、マクロの以下の部分で型が違うとのエラーが出ます。
date2 = ws2.Range("D3").Value

以前も他のマクロをVBSから立ち上げたとき、やはりWORKDAY関数で同じ現象が起きたため、

>>'アドインリフレッシュ
>>Call AddinRefresh(xlApp,"分析ツール")

これを入れて回避しておりました。
同様のことは他でも起こっているようで、当時検索で同じ事例が引っかかっています。
なので、そういう仕様なのだと思っていましたが…。

excel 2003です。

【62288】Re:VBSからマクロの呼び出し
お礼  さくら  - 09/7/6(月) 16:54 -

引用なし
パスワード
   検証したり中身を書いたりしてる間にすれ違ってすみません。
無事動きました。

一回全部窓を閉じて動かしたら今度は無事マクロまで動いたので、
何かが影響していたのかもしれませんね。

成功したマクロとVBSを記入しておきます。
長らくお付き合いいただいて本当にありがとうございました。

しかし…アドインがエラー起こしたり起こさなかったりは何が影響するんでしょうね…。

[VBS側]
Option Explicit
Const cnsBook = "c:\test.xls"
Const strProcName = "before"
dim xlApp,xlBook

Set xlApp = CreateObject("Excel.Application")
' 本スクリプトファイルのフォルダ名の取得

'アドインリフレッシュ
Call AddinRefresh(xlApp,"分析ツール")

xlApp.Visible = True

Set xlBook = xlApp.Workbooks.Open(cnsBook, False, True)
    xlApp.Run strProcName
Set xlBook = Nothing
Set xlApp = Nothing

Private Sub AddinRefresh(inXlsApp,inAddinName)
On Error Resume Next
inXlsApp.AddIns(inAddinName).Installed = False
inXlsApp.AddIns(inAddinName).Installed = True
End Sub


[VBA側]
Sub Before()

Dim ws0 As String
Dim ws1 As Worksheet, ws2 As Worksheet
Dim i As Long, k As Long
Dim date1 As Date, date2 As Date

ws0 = Format$(Date, "yyyyMM")
Set ws1 = ThisWorkbook.Worksheets(ws0)
Set ws2 = ThisWorkbook.Worksheets("日付")
date1 = ws2.Range("D2").Value
date2 = ws2.Range("D3").Value

'------ここから------
For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
  If ws1.Cells(i, 1) > date1 And ws1.Cells(i, 1) < date2 Then
    MsgBox ws1.Cells(i, 1).Value
  End If
Next i
For k = 1 To Range("b" & Rows.Count).End(xlUp).Row
  If ws1.Cells(k, 2) > date1 And ws1.Cells(k, 2) < date2 Then
    MsgBox ws1.Cells(k, 2).Value
  End If
Next k
'------ここまで------

End Sub

'------ここから------
 Dim c As Range
 For Each c In ws1.Range("A1", ws1.Cells(ws1.Rows.Count, 1).End(xlUp))
   Select Case c.Value
    Case date1 To date2
      MsgBox c.Value
   End Select
 Next
'------ここまで------

ここから-ここまではどちらのパターンでも動きました。

【62289】Re:VBSからマクロの呼び出し
発言  kanabun  - 09/7/6(月) 17:21 -

引用なし
パスワード
   ▼さくら さん:
>検証したり中身を書いたりしてる間にすれ違ってすみません。
>無事動きました。
>
>一回全部窓を閉じて動かしたら今度は無事マクロまで動いたので、
>何かが影響していたのかもしれませんね。

わー、よかったです♪

事後談となりますが、
実は、いろいろ試していたら
(手動で 「分析ツール」を組み込んだり、外したり)
こちらでも、VBSから呼び出したときだけ、例のセルが#NAME?になって
「型がちがいます」のエラーで止まる現象が発現しました。

で、VBS のほうをこんな風にしてみたら、
無事実行できました。
一応
>成功した  VBSを記入しておきます。


'------------------------ さくら4.vbs
Dim xlApp
Dim xlBook
Dim strExcelBook
Dim strProcName

'変数定義
  strExcelBook = "D:\(Data)\さくら_テストデータ.xls"
  strProcName = "Before"

  Set xlBook = GetObject(strExcelBook)   'GetObjectでBookを開く
  Set xlApp = xlBook.Application
  xlApp.Visible = true
  xlApp.Run xlBook.Name & "!" & strProcName '◆ Book名も指定
  xlApp.Quit
  Set xlApp = Nothing


>長らくお付き合いいただいて本当にありがとうございました。
こちらこそ、
勉強させてもらいました (^^

3430 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free