2014/08/09

8/09/2014
少々ExcelVBAを使うことがありましたので、備忘録として記載しておきます。

自分自身のブック

ThisWorkbook.Sheets("シート名").Range("アドレス(A1など)")
ThisWorkbook.Sheets("シート名").Cells(行番号,列番号)


セルの指定

Workbooks("エクセルファイル名(フォルダ名は含まない)")_ 
  .Sheets("シート名").Range("アドレス(A1など)")
Workbooks("エクセルファイル名(フォルダ名は含まない)")_
  .Sheets("シート名").Cells(行番号,列番号)
複数プロパティーの指定
With Workbooks("エクセルファイル名(フォルダは含まれない)")_ 
 .Sheets("シート名").Range("アドレス(A1など)")
   .Value = "12000"
   .Formula = "#,##0"
End With
エクセルファイル名にはフォルダ名は含まない。拡張子は必ずつけたほうが良い。(拡張子を省略した場合、エクスプローラの「登録済の拡張子は表示しない」とした場合で動作が異なる場合あり?)

複数シートの選択

Workbooks("エクセルファイル名(フォルダ名は含まない)")_ 
    .Sheets(Array("シート1","シート2")).Select 
シート3,シート4と続く場合は、Arrayの中に追加する。

複数シートの選択解除

Workbooks("エクセルファイル名(フォルダ名は含まない)")_ 
    .Sheets(1).Select 
一番フロントのシートを選択状態にしたほうが良いかもしれません。

選択中のシートを調べる

選択中のシート数を調べる。
Windows(Workbooks("エクセルファイル名(フォルダ名は含まない)").Name)_
     .SelectedSheets.Count
選択中のシート名を一覧する。
For Each sh In Windows( _
  Workbooks("エクセルファイル名(フォルダ名は含まない)").Name).SelectedSheets 
   MsgBox sh.Name
Next


シートの順序入れ替え

With Workbooks("エクセルファイル名(フォルダ名は含まない)")
      .Sheets("移動対象シート").Move Before:= .Sheets("シート")
End With
移動対象シートをシート名の前に移動する。後ろに移動する場合はBeforeの箇所にAfterを指定する。

異なるワークブックからシートをコピー

With Workbooks("エクセルファイル名(フォルダ名は含まない)")
   .Sheets("コピー対象シート").Copy Before:= _ 
  Workbooks("コピー先エクセルファイル名(フォルダ名は含まない)").Sheets("コピー先シート")
End With
コピー先シートの前にコピー対象シートをコピーする。後ろにコピーする場合、Beforeの箇所にAfterを指定する。

セルコピー

With Workbooks("エクセルファイル名(フォルダ名は含まない)")
  .Sheets("コピー元シート").Range("セル範囲(A1:A2など)").Copy _ 
    .Sheets("コピー先シート").Range("セル範囲(B1:B2など)")
End With
Copyメソッドは必ずクリップボードが使われます。 MS Excel VBA Range.Copyリファレンスには、コピー先を省略した場合、クリップボードにコピーされますとありますが、コピー先を指定してもクリップボードが使われます。注意してください。

描画停止/再開

停止
Application.Screenupdateing = False
再開
Application.Screenupdateing = True


計算停止/再開

停止
Application.calculation = xlManual
再開
Application.calculation = xlAuto


プリンタとの通信を停止/再開

停止
Application.PrintCommunication = False
再開
Application.PrintCommunication = True
停止するとPageSetupの高速化が図れる。ただし、当該プロパティはExcel2010より前のバージョンには存在しないので注意。

プロパティーの存在チェック

少々雑なコードですが...PrintCommunicationがあるかどうか調べています。
  If hashasPrintCommunication(Application) Then
   MsgBox "PrintCommunicationあります"
Else
   MsgBox "PrintCommunicationありません"
End If
Function hasPrintCommunication(o As Object) As Boolean
   On Error Goto hasPrintCommunication_error:
   Dim s As Boolean
   s = o.PrintCommunication
   hasPrintCommunication = True
hasPrintCommunication_exit:
   Exit Function
hasPrintCommunication_error:
   Resume hasPrintCommunication
End Function
プロパティの存在チェックを調べたところ、TypeLib Informationを使って調べる方法があるようです。こちらは今後使ってみます。

VBEの起動

ALT+F11キーで、VBEが起動します。

0 コメント:

コメントを投稿