Excel VBAのビギナーです。

ビギナーなので本当になんじゃそりゃというレベルですが、一応。
どうやって書き始めるの?

…というホントにしょうがないレベルですが、方法は2つあります。

  • Excelのメニューからツール⇒マクロ⇒マクロ...⇒を選び、 コンボボックスの部分にマクロ(Subプロシージャ)の名前を入力して「作成」
  • Excelのメニューからツール⇒マクロ⇒Visual Basic Editor でVisual Basic Editorを開き、 そのメニューから挿入⇒標準モジュールを選び、自分でSub文から書く。
いずれも標準モジュール「Module1」というものができます。 マクロは通常標準モジュールに記述します。


Private Subで構造化する

Sub ○○〜End Subというプロシージャを作ると、 ○○はマクロのメニューでも選択して実行可能です。 他のプロシージャから呼ばれることを専ら想定していて、 マクロのメニューからは呼ばれたくないものがある場合、 「Private」を頭につけて「Private Sub ○○」とすればOKです。


セキュリティ設定でブロックされる

作ったマクロを他の人に配ろうとすると、中には 「セキュリティレベルが『高』に設定されているのでマクロが開けない」 というダイアログが出る人がいると思います。 セキュリティレベルを変更するには、 メニューからツール⇒オプション⇒セキュリティ⇒マクロ セキュリティ... を押し、レベルを「中」に変更します。 「中」にするとファイルを開くたびに警告が出ますが、 「マクロを有効にする」を選ぶと使えるようになります。
マクロウィルスは開かないように、注意が必要ですが…

なおExcel2007では、セキュリティセンター⇒マクロで 「信頼できる置き場所」を登録すれば、 そのフォルダ(とそのサブフォルダ全体を含むようにさせることもできます) に置いてあるExcelファイルのマクロは自由に実行できる一方、 その他の=信頼しない置き場所のマクロは一切無効にする、 ということができます。


タブ区切りのテキストファイルをシートに読む超基本マクロ

Sub ReadTextFile()
'
' "data.txt"ファイルをタブ区切りテキストファイルとして読み、
' "データ"シートの左上から内容を上書きします。
' データの列数は5個で固定です。
'
    Const FILE_NAME As String = "data.txt"
    Dim n As Integer
    Dim a As String
    Dim data As Variant
    Dim row As Integer

    n = FreeFile
    ' Open "C:\usr\lang\excel\test.txt" For Input As #n
    ' 相対パスで開きたい場合、カレントフォルダは、このExcelファイルがある
    ' フォルダとは限らないので、次のようにパスを明示する必要があります。
    Open ThisWorkbook.Path & "\" & FILE_NAME For Input As #n
    row = 1
    Do Until EOF(n)
        Line Input #n, a
        data = Split(a, vbTab)
        Range(Cells(row, 1), Cells(row, 5)) = data
        row = row + 1
    Loop

    Close #n

End Sub


セルを読む+他にコピーする超基本マクロ

以下のマクロは、"データ"シートの1列目の値を、 重複を省いて、"集計"シートの1列目に複製します。
コピー元の"データ"シートの値は、既に昇順に並んでいることが前提です。 また、事前にコピー先"集計"シートのクリア処理はしません。

Private Sub CreatePibSheet()
    Dim row As Integer
    Dim newRow As Integer
    Dim prevValue As String
    Dim v As String
    Const NEW_ROW_START As Integer = 3

    '"データ"シートに移動。
    Sheets("データ").Select

    '"データ"シートには見出しが1行あるので2行目から
    row = 2
    '"集計"シートには見出しが2行あるので3行目から
    newRow = NEW_ROW_START
    prevValue = "(dummy)"
    ' 1列目を縦に見ながら値がある限りループ
    Do While ActiveSheet.Cells(row, 1) <> ""
        v = ActiveSheet.Cells(row, 1)
        If v <> prevValue Then
            ' 新しい値が現れたら、"集計"シートに新しい行を作る。
            ' その際に4行目以降は、3行目をコピーすることで、
            ' 数式(VLOOKUP関数)を各セルにコピーする。
            If newRow > NEW_ROW_START Then
                Sheets("集計").Rows(NEW_ROW_START).Copy _
                  Destination:=Sheets("集計").Rows(newRow)
            End If

            ' 1列目の値をさらに上書きする。
            Sheets("集計").Cells(newRow, 1) = v
            prevValue = v
            newRow = newRow + 1
        End If
        row = row + 1
    Loop
End Sub

ポイント(本筋と関係ないものもありますが)は、
  • 「Sheets("シート名").Select」とすることで、 以降そのシートのセルを「ActiveSheet.Cells(行, 列)」で参照できる。
  • 空欄が現れるまでループするには、 「Do While ActiveSheet.Cells(行, 列) <> ""」で、 行、列の値を変数で変えながら実行すればよい。
  • 「Sheets("シート名").Rows(元行).Copy Destination:=Sheets("シート名").Rows(先行)」 で、行をコピーできる。 このとき、相対セル参照の数式が含まれる場合、 マウスでドラッグした際などと同じようにきちんと参照が変化します。

Misc. Topics Top

(first uploaded 2006/07/09 last updated 2010/04/11, URANO398)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル