エクセルマクロ備忘録 -2ページ目

エクセルマクロ備忘録

EXCEL VBAマクロ サンプル集


ホリスティックリンパエステサロンGOLDのホームページ
http://www.baycom.zaq.ne.jp/bgcnb202/index.html

コーヤンのホームページ

<プロテクト>

'************************************************************
 
   'シートのプロテクト
    ActiveSheet.Protect

    'シートのプロテクトの解除
    ActiveSheet.Unprotect

'************************************************************


<画面の制御>

'************************************************************

    '画面の動きを止める   
    Application.ScreenUpdating = False

    '画面の動きを再開する   
    Application.ScreenUpdating = True

'************************************************************


<オートフィルター>

'************************************************************

    'オートフィルターがかかっているかどうか判断する
    If ActiveSheet.AutoFilterMode = True Then
        'オートフィルターがかかっています
        MsgBox "filter on"
         'オートフィルターの解除
        Selection.AutoFilter
   Else
        'オートフィルターがかかっていません
        MsgBox "filter off"
    End If

'************************************************************


<カーソルの移動>

'************************************************************

    'カーソルの移動方向を変更する
    Application.MoveAfterReturnDirection = xlDown       'カーソル移動を下方向へ
    Application.MoveAfterReturnDirection = xlToRight    'カーソル移動を右方向へ

    'カレントセルを入力されている最後の行へ移動させる(上から下へ)
    Range("A1").Select
    Selection.End(xlDown).Select

    'カレントセルを入力されている最後の行へ移動させる(下から上へ)
    Range("A10000").Select
    Selection.End(xlUp).Select

    'オフセット命令(1行下へ)
    '              (行、列)
    Selection.Offset(1, 0).Select

    'オフセット命令(1列右へ)
                   (行、列)
    Selection.Offset(0, 1).Select

'************************************************************


<テキストボックス・コンボボックス>

'************************************************************

'テキストボックス1の内容をA1のセルに転記する
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Range("A1") = TextBox1.Text
End Sub

'************************************************************

'A2のセルの内容をテキストボックス1に転記する
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    TextBox2.Text = Range("A2")
End Sub

'************************************************************

    'コマンドボタンからテキストボックスへフォーカスを移動する際に、
    'テキストボックスの文字を全部選択状態にするには、コマンドボタン
    'をクリックした時に次の命令を実行する

    SendKeys "{TAB}"

'************************************************************

Private Sub UserForm_Initialize()
    'コンボボックスのリストに列名をセットする
    ComboBoxリスト.AddItem Range("D1")
    ComboBoxリスト.AddItem Range("E1")
    ComboBoxリスト.AddItem Range("F1")
    ComboBoxリスト.AddItem Range("G1")
    ComboBoxリスト.AddItem Range("H1")
    ComboBoxリスト.AddItem Range("I1")
    ComboBoxリスト.AddItem Range("J1")
End Sub

'************************************************************


<検 索>

'************************************************************

'L6のセルに 前 の字があるかどうかを調べ、あれば、メッセージを表示
    Range("L6").Select
    If Range("L6") Like "*前*" Then
        MsgBox "「前」見っけ"
    End If

'************************************************************


    Dim sGyo As Integer  '検索して見つかった行を記憶する変数
    Dim wRowL As Integer '検索範囲の最後の行数を記憶する変数
   
    Worksheets("リスト").Activate
    wRowL = 10000
    sGyo = wRowL
   
    With Worksheets("リスト").Range("A2:A" & wRowL & "")
       '番号で検索する。
       Set c = .Find(Txt番号.Text, LookIn:=xlValues)
       If Not c Is Nothing Then
           firstAddress = c.Address
           sGyo = c.Row
       Else
           GoTo FindError
       End If
    End With


FindError:
 'エラー処理

'************************************************************

<エラー処理>

'************************************************************

'エラーが発生した時の処理
On Error GoTo err_01

    'オフセット命令(1行上へ)
                   (行、列)
    Selection.Offset(-1, 0).Select

'エラー(この場合、上へ1行けないとき)の処理
err_01:
    Exit Sub

'************************************************************


<セル選択・値の取得・文字列変換>

'************************************************************


   '人数の受け入れ
    ninzu = InputBox("人数を入力してください。", "人数の入力")

'************************************************************

'メッセージボックスを表示して OK、キャンセルの判断を求める
    w_yn = MsgBox(" すべてクリアします。よろしいですか?" & Chr(13) _
         & "  復活できませんので、念のため保存をしておいてください。", vbOKCancel, " クリア")
     'w_yn=1:OK, =2:Cancel
     'キャンセルを選んだとき
    If w_yn = 2 Then
        Exit Sub
    End If

'メッセージボックスを表示してイエス、ノーの判断を求める
Sub Macro2()
    Dim w_yn As Integer
    ActiveWindow.SelectedSheets.PrintPreview
    w_yn = MsgBox("印字しますか?", vbYesNo, "印字")
    If w_yn = 6 Then
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    End If
End Sub

'メッセージボックスを表示してイエス、ノー、キャンセルの判断を求める
     w_yn = MsgBox("削除しますか?", vbYesNoCancel, "重複データの削除")
     'w_yn=6:Yes, =7:No, =2:Cancel
     'キャンセルを選んだとき
     If w_yn = 2 Then
         Exit Sub
     End If
     'Yes を選んだとき
     If w_yn = 6 Then
         Selection.Delete Shift:=xlUp
     End If

'************************************************************

    '列と行を数字で指定してセルを選択する
    '      行    列
    Cells(wRow, wCol).Select

    '複数セルの選択
    Range(Cells(5, ActiveCell.Column), Cells(10000, ActiveCell.Column)).Select

'************************************************************

    '数値の入っているセルだけを選択する
    Selection.SpecialCells(xlCellTypeConstants, 1).Select

'************************************************************

'カレントセルの行、列を取得し、そのセルの内容を表示する

   '現在の行を記憶する変数
    Dim w_Gyo As Long
    '現在の列を記憶する変数
    Dim w_Retu As Integer
    '数字をアルファベットへ変換するための変数
    Dim a_Retu As String
   
    '現在の行を記憶する(1行目=1から始まる数字)
    w_Gyo = ActiveCell.Row
    '現在の列を記憶する(A列=1から始まる数字)
    w_Retu = ActiveCell.Column
   
    '記憶した行、列を表示する
    MsgBox "現在の行は: " & w_Gyo
    MsgBox "現在の列は: " & w_Retu
   

'************************************************************

    
    'w_Retuをアルファベットへ変換する( Chr(65) は A を示す)
    a_Retu = Chr(w_Retu + 64)
    '                                       ( 列       行 )
    MsgBox "現在のセルの内容は: " & Range(a_Retu & w_Gyo & "").Text

'************************************************************

    
    カラム数をABCの文字へ変換する
    Select Case ActiveCell.Column
        Case Is < 27
            retsumoji = Chr(ActiveCell.Column + 64)
        Case Is < 53
            retsumoji = "A" & Chr(ActiveCell.Column + 64 - 26)
        Case Is < 79
            retsumoji = "B" & Chr(ActiveCell.Column + 64 - 52)
        Case Is < 105
            retsumoji = "C" & Chr(ActiveCell.Column + 64 - 78)
    End Select

    'アクティブセル番地をA1形式で表示する
    MsgBox ActiveCell.Address(xlA1)

    'アクティブセル番地のA1形式から列番号のみを抽出する
    Dim w_ACol As String   
    w_ACol = Replace(Left(ActiveCell.Address(xlA1), 3), "$", "")

'************************************************************

    '文書番号と発送日を入力させる
   
    Dim aa As String
    Dim bb As Date

    aa = InputBox("文書番号を入力してください。", "文書番号")
    bb = InputBox("発送日を入力してください。", "発送日")
   
    MsgBox "第 " & aa & " 号"
    MsgBox Format(bb, "ggge年mm月dd日")

'************************************************************

    '日付の設定

    '選択したセルの表示形式を「月曜日」のように設定
    Range("A1").Select
    Selection.NumberFormatLocal = "aaaa"
   
    '選択したセルの表示形式を「月」のように設定
    Range("A2").Select
    Selection.NumberFormatLocal = "aaa"
   
    '選択したセルの表示形式を「(月)」のように設定
    Range("A3").Select
    Selection.NumberFormatLocal = "(aaa)"
   
    '選択したセルの表示形式を「monday」のように設定
    Range("A4").Select
    Selection.NumberFormatLocal = "dddd"
   
    '選択したセルの表示形式を「mon」のように設定
    Range("A5").Select
    Selection.NumberFormatLocal = "ddd"
   
    '選択したセルの表示形式を「平成17年04月11日(月)」のように設定
    Range("A6").Select
    Selection.NumberFormatLocal = "ggge年mm月dd日(aaa)"
   
    '選択したセルの表示形式を「平成17年4月4日(月)」のように設定
    Range("A7").Select
    Selection.NumberFormatLocal = "gge年m月d日(aaa)"
   
    '選択したセルの表示形式を「H17.4.4(月)」のように設定
    Range("A8").Select
    Selection.NumberFormatLocal = "ge.m.d(aaa)"
   
    'フォーマット関数を使って
    '選択したセルの表示形式を「平成17年04月11日(月)」のように設定
    Range("A9") = Format(DateValue("2005/4/11"), "ggge年mm月dd日(aaa)")

'************************************************************

'キー入力した内容を送る
Private Sub Report_Activate()
    SendKeys "%vz{down}{down}{down}{enter}"
End Sub

'************************************************************

    'セルの背景色を変える
    Range("A1").Select
    Selection.Interior.ColorIndex = xlNone      '色無しにする
    Selection.Interior.ColorIndex = 3           '赤色にする

'************************************************************

    'テキストボックスの内容をカンマ付数字で表示する
    TextBox1.Text = Format(TextBox1.Text, "#,##0")

'************************************************************

    'テキストボックスの内容を3桁づつスペースで区分けして表示する
    TextBox1.Text = Format(TextBox1.Text, "### ### ### ###")

'************************************************************

    'マイナス表示を△表示に変換する
    Range("A1") = Replace("- 123 456", "-", "△ ", 1, , vbTextCompare)

'************************************************************

'「"」を数式の中に入れるには

    'A1セルに 「=IF(B1="","a",C1)」 という式を入れたい

    Range("A1") = "=IF(B1="""",""a"",C1)"

    ' A1 のセルに「="大阪府"&C1」と数式を入れたい。「"」は Chr(34) で表せる
    '下記の例で、 C1 セルに「大阪市」と入っており、
    '実行結果は、 A1 のセルに「大阪府大阪市」と表示される。
   
    Range("A1") = "=" & Chr(34) & "大阪府" & Chr(34) & "&C1"

'************************************************************

'セルへ数式を入れるサンプル

Private Sub Workbook_Open()
   
    Application.ScreenUpdating = False
    Sheets("送付書").Select
    Range("J15") = "=VLOOKUP(J1,支店リスト!$A$5:$O$416,12,0)"
    Range("J16").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(R[-15]C,支店リスト!R5C1:R416C15,15,0)"
    Range("A26").Select
    ActiveCell.FormulaR1C1 = "=" & Chr(34) & "本店      " & Chr(34) & _
        "&VLOOKUP(R[-25]C[9],支店リスト!R5C1:R416C12,3,0)"
    Sheets("支店リスト").Select
    Application.ScreenUpdating = True
End Sub

'************************************************************

'ほかのBookのセルから値を転記する

    Sheets("Sheet1").Range("A1") = _
             Workbooks("Book2.xls").Sheets("Sheet1").Range("A1")

'************************************************************

小数点以下を切り上げる

    Dim pNum As Integer
   
    Sheets("Sheet1").Select
    wCol = ActiveCell.Row
    pNum = Round((wCol - 2) / 40, 0)
   
    If pNum < ((wCol - 2) / 40) Then
        pNum = pNum + 1
    End If

'************************************************************

小数点以下を切り上げる(その2) ワークシート関数を使用

    Dim rndUp As Integer
   
    '小数点以下を切り上げる
    rndUp = Application.WorksheetFunction.RoundUp(1.1, 0)
   
    MsgBox rndUp

'************************************************************

Wait メソッドの使用例

次の使用例は、実行中のマクロを当日の午後 6 時 23 分まで停止します。

Application.Wait "18:23:00"
次の使用例は、実行中のマクロを約 10 秒間停止します。

newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 10
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
次の使用例は、10 秒を過ぎるとメッセージを表示します。

If Application.Wait(Now + TimeValue("0:00:10")) Then
    MsgBox "時間が過ぎました。"
End If

'************************************************************

'配列関数で支店名を入れる

    Dim w_Jimmei As Variant
    w_Jimmei = Array(, "北海道", , "青 森", "宮 城", , , , , , "東 京", _
                   "神奈川", , , , "静 岡", "愛 知", "京 都", "大 阪", _
                   "兵 庫", "福 岡", "鹿児島")

        Range("F" & w_Row & "") = w_Jimmei(Range("B" & w_Row & ""))

'************************************************************


<ファイル操作>

'************************************************************

'ファイル名を変更して保存する

    Dim wrkName As String

    wrkName = ActiveWorkbook.Name
   
    ActiveWorkbook.SaveAs Filename:="Y:\BACKUP\担当用\" & "次" & wrkName, _
        FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
   
    wrkName = ActiveWorkbook.Name
    MsgBox "ファイル名を " & wrkName & " に変更し、保存しました。" _
        & Chr(13) & "後で、ファイル名を適切な名称に変更してください。", _
        , "ファイル名の変更"

'************************************************************

'ファイルを保存しないでエクセルを強制終了する
Application.DisplayAlerts = False      'ファイルを保存しない
Application.Quit                       'エクセルの終了

'************************************************************

'ファイルを保存後エクセルを強制終了する
    '保存し終了
    ActiveWorkbook.Save
    Application.Quit

'************************************************************

'ファイルを開くダイアログを開く

 Application.GetOpenFilename "Excelファイル (*.xls), *.xls", , , , false

'

'************************************************************