|
ビギナーなので本当になんじゃそりゃというレベルですが、一応。
…というホントにしょうがないレベルですが、方法は2つあります。
-
Excelのメニューからツール⇒マクロ⇒マクロ...⇒を選び、
コンボボックスの部分にマクロ(Subプロシージャ)の名前を入力して「作成」
-
Excelのメニューからツール⇒マクロ⇒Visual Basic Editor
でVisual Basic Editorを開き、
そのメニューから挿入⇒標準モジュールを選び、自分でSub文から書く。
いずれも標準モジュール「Module1」というものができます。
マクロは通常標準モジュールに記述します。
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(先行)」
で、行をコピーできる。
このとき、相対セル参照の数式が含まれる場合、
マウスでドラッグした際などと同じようにきちんと参照が変化します。
(first uploaded 2006/07/09 last updated 2010/04/11, URANO398)
|