2012年9月28日金曜日

○第165回目 エクセルマクロの基本コマンド

 エクセルマクロの基本コマンドは何か、というものです。
 基本とは、結構、頻繁に使われるというコマンド群をさします。
 これさえあれば、骨格の70%はできるというものです。


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 初心者の方へ
┃ 以下のそれぞれのマクロ(□以下に書かれているもの。不適
┃なものもある。)を、モジュールに貼り付けて、デバックして
┃、それぞれの変数にどのような数値がはいるのか試してくださ
┃い。変数の初期値はゼロなので、うまく動かないものもありま
┃す。
┃ マクロのイメージが少し分かります。
┃ ・エクセルのマクロの世界への移行。=⇒エクセルシートに
┃いて、Alt+F11を押す。+は同時押しの意味です。すなわち、Al
┃tとF11を同時に押す。
┃ ・(以下はマクロの世界での操作)モジュールシートを作る=
┃⇒Alt、I、M(この場合は逐次押しで良い)
┃ ・(以下はモジュール上での操作)"sub test01()" を貼り付
┃ける。自動的に、"End Sub"が付加される。
┃ ・Sub test01()とEnd Subの間に、以下のマクロを貼付ける。
┃ ・F8を押すと色のついたマクロ行が1行ずつ実行される。
┃ ・処理後のマクロ行の変数にカーソルを置くと、その変数の
┃ ・処理後のマクロ行の変数にカーソルを置くと、その変数の
┃内容が表示される。つまり、そのマクロ行の処理内容がわかる
┃ ・一気に処理を進めたい場合は、任意のマクロ行にカーソル
┃を移し、Ctrl+F8を押す。そこまで処理が一気に進む。
┃  End Subにカーソルを置き、Ctrl+F8を押すと、終了直前の
┃状態になる。この状態でも変数の内容の確認ができる。
┃ ・モジュールを削除する(必要な場合(モジュールつきのブッ
┃クを保存する場合、拡張子を変更する必要があるので、気持ち
┃が悪いという人の場合))=⇒画面左上のプロジェクトウィンド
┃ウのmodule1などを右クリックし、モジュールの解放を選択。
┃保存の有無が聞かれるが、保存してもしなくても良い。
┃ ・エクセルの世界へ戻る=⇒Alt+F11を押す。
┃ ・エクセル2010の場合、モジュール付きのブックを登録する
┃時は、拡張子を"xlsm"にする必要があります。
┃ ・おまけ。以下は完結したマクロです。これも貼り付けで試
┃してみてください
┃  Sub 和を求める()
┃   '数値の指定
┃    Suuti = InputBox("数値を入れてください。", , 10) 
┃                                                       
┃    kotae = 0
┃    For i = 1 To Suuti Step 1
┃      kotae = kotae + i
┃    Next
┃    MsgBox ("1から" & Suuti & "まで加算した答えは、" &
┃ kotae & "です。")

┃    End Sub
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛



□実行時のブック(ファイル)の属性(ぶっく名、シートの属性)の取得
    fname1 = ActiveWorkbook.Name
    shname1 = ActiveSheet.Name
    ii_max = Sheets.Count
    ii0 = ActiveSheet.Index
 

□実行時のセルの指定範囲の情報の取得
 ''範囲情報の取得
    AAA = Selection.Address
    gyo1 = Selection.Row
    gyo_cnt = Selection.Rows.Count
    gyo9 = gyo1 + gyo_cnt - 1
    retu1 = Selection.Column
    retu_cnt = Selection.Columns.Count
    retu9 = retu1 + retu_cnt - 1
    AAA11 = Cells(gyo1, retu1).Address
    AAA9 = Cells(gyo9, retu9).Address
 

□シート名の取得
'シート名の取得
    Dim p_mm0(100)
    cc = Sheets.Count
    For i = 1 To cc   'ワークシートの数だけ繰り返す
       p_mm0(i) = Sheets(i).Name '取得したシート名を取得する
    Next i
 

□(例えば、設定された)範囲のセル群から値を取得
    Dim atai(100,110)
    for i = 1 to gyo_cnt
      for j = 1 to retu_cnt
        atai(i,j) = Cells(4 + i - 1, 3 + j - 1).Value
      next
    next
  

□(例えば、設定された)範囲のセル群から計算式を取得
 '計算式の取得
    Dim shiki(100)
    for i = 1 to gyo_cnt
        If Cells(4 + i - 1, 3).HasFormula = True Then
           shiki(i) = "xxx" & Cells(4 + i - 1, 3).Formula
        Else
           shiki(i) = ""
        End If
    next
 

□ブック、シートの指定
    Windows(fname1).Activate 'ブック名
    Sheets(ii0).Select 'シート番号
    Sheets(shname1).Select 'シート名
   
□セルの指定
    Range(AAA).Select  'AAAには、"A5"、"B5:B10"などの座標が入っている。
   Cells(4, 3).Select
   Range(Cells(4, 3),Cells(10, 6)).Select
 

□コピー
    Dim b_name(100)
    Windows(fname1).Activate '現在のブックであれば省略可能
    Sheets(ii0).Select '現在のシートであれば省略可能
    Range(Cells(4 , 3 ), Cells(10, 6)).Select
    Selection.Copy

    Windows(b_name(bk_no)).Activate '現在のブックであれば省略可能
    Sheets(h2).Activate '現在のシートであれば省略可能
    Cells(24, 23 + cc).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
      False, Transpose:=False
 

'計算式
    Selection.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


'数値と数値の書式
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 

'列幅
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 

'書式
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 

'リンク貼付け
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    ActiveSheet.Paste Link:=True
 

'縦横変換コピー。値及び数値書式のみ
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
 

□セルに数値を書きだす
    Cells(4 + i - 1, 3 + j - 1) = atai
  

□セルに計算式を書きだす
    Cells(4 + i - 1, 3 + j - 1) = atai '=から始まっている文字列
 

□画面から入力
    h1 = InputBox("飛び先のシート番号を入れてください。 そのままのシートの場合は、0。-1,*1も可" & vbCrLf ,, 1)

□画面に出力
  Suuti = 10
  kotae = 55
  MsgBox ("1から" & Suuti & "まで加算した答えは、" & kotae & " です。")

□セルの座標の入力1(画面から)
  Dim セ As Range
  Set セル範囲 = Application.InputBox(Prompt:="次のセット範囲の先頭のセルを指定してください", Default:=AAA1, Left:=10, Top:=2, Type:=8)
 aaa2 = セル範囲.Address

'      Type:=の値 意味
'      0 数式
'      1 数値
'      2 文字列(テキスト)
'      4 論理値(TrueまたはFalse)
'      8 セル参照(Rangeオブジェクト)
'     16 エラー値(#N/Aなど)
'     64 数値配列

□セルの座標の入力2(画面から)
  Dim せる範囲 As Variant
'セルの設定
  in_rrcc01 = "C4"
  せる範囲 = Application.InputBox(Prompt:="使用するセルを指定してください。終了はキャンセルキー。", Default:="=" & in_rrcc01, Left:=10, Top:=2, Type:=0)
  If せる範囲 = False Then errflag = 0: Exit Do
'セルの座標をA1形式にするための処理
  in_rrcc2 = Application.ConvertFormula(Formula:=せる範囲, _
  FromReferenceStyle:=xlR1C1, ToReferenceStyle:=xlA1, ToAbsolute:=xlAbsolute)
  in_rrcc2 = Mid(in_rrcc2, 2)
  Range(in_rrcc2).Select
  gyo21 = Selection.Row
  retu21 = Selection.Column
 

□計算式の入力(画面から)
  Dim せる範囲 As Variant
  in_rrcc01 = "C4"
  keisansikin = Application.InputBox(Prompt:="計算式を入力してください。終了はキャンセルキー。", Default:="=" & in_rrcc01, Left:=10, Top:=2, Type:=0)
 

□時間の取得、処理時間の算定
   t10 = Time
   t9 = Time
   Cells(p1 + pp1, 3) = " 終了時間は、" & Application.WorksheetFunction.Text(t9, "hh:mm:ss") & "です。": pp1 = pp1 + 1
   Cells(p1 + pp1, 3) = " 処理時間は、" & Application.WorksheetFunction.Text(t9 - t10, "hh:mm:ss") & "です。": pp1 = pp1 + 1
 

□連続してセルに出力(下方向)するときの工夫
  pp1 = 3
  p1 = pp1 + 1: pp1 = 0
  Cells(p1 + pp1, 3) = " 終了時間は、" & Application.WorksheetFunction.Text(t9, "hh:mm:ss") & "です。": pp1 = pp1 + 1
  Cells(p1 + pp1, 3) = " 処理時間は、" & Application.WorksheetFunction.Text(t9 - t10, "hh:mm:ss") & "です。": pp1 = pp1 + 1
  Cells(p1 + pp1, 3) = " 処理レコード数は、" & Str$(jj_cnt) & "件です。": pp1 = pp1 + 1
  Cells(p1 + pp1, 3) = " 出力件数は、" & jj_cnt2 & "件です。": pp1 = pp1 + 1
 

□inputboxを使用したメニュー表示
  Dim b_name(100)
  bk_no = InputBox("使用したいブックを指定してください。そのままは0。そのままのシートの場合は、99。 " & vbCrLf & _
    "終了はキャンセルキー。" & vbCrLf & _
    "01=⇒" & b_name(1) & vbCrLf & "02=⇒" & b_name(2) & vbCrLf & _
    "03=⇒" & b_name(3) & vbCrLf & "04=⇒" & b_name(4) & vbCrLf & _
    "05=⇒" & b_name(5) & vbCrLf & "06=⇒" & b_name(6) & vbCrLf & _
    "07=⇒" & b_name(7) & vbCrLf & "08=⇒" & b_name(8) & vbCrLf & _
    "09=⇒" & b_name(9) & vbCrLf & "10=⇒" & b_name(10) & vbCrLf & _
    "11=⇒" & b_name(11) & vbCrLf & "12=⇒" & b_name(12) & vbCrLf & _
    "13=⇒" & b_name(13) & vbCrLf & "14=⇒" & b_name(14) & vbCrLf & _
    "15=⇒" & b_name(15) & vbCrLf _
    , xpos:=2000, ypos:=3000, Default:=99)
' ※vbCrLfは改行のこと

□画面の抑止・解放
'画面を止める
Application.ScreenUpdating = False
'画面を更新する
Application.ScreenUpdating = True
 

□自動計算の抑止・解放
'再計算を停止
    With Application
        .Calculation = xlManual
    End With
'再計算を実施
    With Application
        .Calculation = xlAutomatic
    End With
 

□エラーになった場合の処理(エラーになった場合、次の行の処理をする)
    On Error Resume Next
 

□エラーになった場合の処理(エラーになった場合、特殊な処理をする)
  On Error GoTo ErrorTrap
 
  ErrorTrap:
    errflag = 99
    Resume Next


0 件のコメント: