goo blog サービス終了のお知らせ 

開発頭-kenken

写真付きで日記や趣味を書くならgooブログ

最近node.jsが気になってきました。

VBAからVBスクリプトへ引数渡しでコールする(Shell)

2016-02-02 17:46:25 | Access・VBA

ほんとはVBAだけでショートカットのリンク先を一括変換したかったんだけど、調べた限りできそうもないのでVBSを呼び出して変換することにした。

その変換するための第一弾がこれです。

■VBA側

Sub Shellbat()
'**************************************************
'VB/VBAからShell関数を使い.vbsを実行する
'**************************************************
'上記注意①~⑥必須

  Dim strPath As String
  Dim RetVal As Variant
  Dim para1, para2 As String
  para1 = "ishikawa"
  para2 = "takuboku"

  strPath = "D:\Access\VBAからVBSコール\test.vbs"
  RetVal = Shell("WScript.exe """ & strPath & """" & " " & para1 & " " & para2)

  If RetVal <> 0 Then
   MsgBox strPath & vbCr & "実行されました。", vbInformation, "[タスクID]" & RetVal
  Else
   MsgBox strPath & vbCr & "実行出来ません。", vbCritical, "[ERROR]"
  End If

End Sub

■VBS側

  WScript.Echo "test.vbs"

  '変数 Prms に引数コレクションを取得
  Set Prms = WScript.Arguments

  '引数の数だけループ
  For i = 0 To Prms.Count - 1
    WScript.Echo "パラメータ(" & i & ")→" & Prms(i)
  Next

 
 ※普通に取得するなら

 WScript.EchoWScript.Arguments(0)   ' 1番目のパラメータ

WScript.EchoWScript.Arguments(1)    ' 2番目のパラメータ


SQLでクロス集計(TRANSFORM )

2013-12-01 10:00:27 | Access・VBA

Attribute VB_Name = "Module1"
Option Compare Database
Option Explicit


Public Sub adoQueryXSyuei()
  Dim cnc As New ADODB.Connection
  Dim rst As New ADODB.Recordset
  Dim cmd As New ADODB.Command
  Dim fld As ADODB.Field

  Set cnc = CurrentProject.Connection
  Set cmd.ActiveConnection = cnc
  cmd.CommandText = "TRANSFORM Sum(売上明細.金額) " & _
      "SELECT 売上明細.担当者 " & _          '行見出し
      "FROM 売上明細 " & _
      "GROUP BY 売上明細.担当者 " & _       '行見出しでグルーピング
      "PIVOT 売上明細.商品;"                      '列見出し
  Set rst = cmd.Execute

  For Each fld In rst.Fields
      Debug.Print fld.Name,
  Next fld

  '---  クロス集計した結果を表示
  Do Until rst.EOF
      For Each fld In rst.Fields
          Debug.Print fld.Value,
      Next fld
      Debug.Print
      rst.MoveNext
  Loop

  'Debug.Print rst.GetString

  rst.Close
  Set rst = Nothing
  cnc.Close
  Set cnc = Nothing
End Sub

 

参考

 

 


VBAで処理中断ボタンの作り方

2011-05-26 21:36:34 | Access・VBA

参照したページ

処理中にキャンセルしたいとき、DoEventsを使って他のイベントを受付けることができるらしい。

<プログラム>
Dim bCancel As Boolean 'キャンセルボタンの実行有無

'実行ボタンの処理
Private Sub OK_Click()
  DoCmd.Hourglass True 'カーソルを砂時計にする
  bCancel = False
  Do
    ・
    ・
    DoEvents '他のイベントを処理する
    If bCancel = True Then Exit Do 'キャンセルボタンが押された?
  Loop
  If bCancel = True Then 'キャンセルボタンが押された?
     'キャンセル時の処理
  End If
  DoCmd.Hourglass False 'カーソルを元に戻す
End Sub
  ・
'キャンセルボタンの処理
Private Sub Cancel_Click()
  bCancel = True
End Sub


■VBA例の説明
実行処理のループ処理内の最後にDoEventsにより他のイベント処理を行います。 例題ではキャンセルボタンの処理ではbCancelをTrueに変更しています。 そしてイベント処理が終了したならばbCancelの状態をチェックすればよいことになります。

■注意事項
このDoEventsは全てのイベント処理を受け付けてしまいます。 つまり、処理実行中に自分の処理である実行ボタンも実行できたり、テキストボックスにも入力可能になります。 その結果、処理結果が保証できなくなりますのでキャンセルボタン以外は実行しないようにします。
マウスポインタを変更するDoCmd.HourglassはAccessVBAのみでExcelVBAでは使用できません。 Excelのフォームモジュールのみで使用可能ですが、砂時計にするにはMe.MousePointer = fmMousePointerHourGlass
元に戻すにはMe.MousePointer = fmMousePointerArrowになります。