ExcelのVBAでテキストファイルを出力する方法を考える。
次はアクティブシートのセルA1からA10の内容を「出力結果.txt」というテキストファイルに出力する場合のコードである。
この例ではセルの中身を単純にそのまま書き出しているが、実際には何らかの変換を施して使うのであろう。
Sub テキストとして出力()
fnsave = “出力結果.txt”
numff = FreeFile
Open fnsave For Output As #numff
For i = 1 To 10
temp = Cells(i, 1)
Print #numff, temp
Next i
Close #numff
End Sub
次のコードは出力する内容を変数にため込み、一気に書き込む方法である。
セルの順番を入れ替えたり、セル同士を結合したり、上の例より柔軟に処理ができるかもしれない。
ただし、上と違って、自動的に改行が入らないことに注意する。もし改行を入れるならば「temp = temp & Cells(i, 1)」のところを「temp = temp & Cells(i, 1) & Chr(13)」と書くとよい。
Sub テキストとして出力2()
fnsave = “出力結果.txt”
numff = FreeFile
Open fnsave For Output As #numff
temp = “”
For i = 1 To 10
temp = temp & Cells(i, 1)
Next i
Print #numff, temp
Close #numff
End Sub
ファイル名を変えたり、保存場所を変えたりしたい場合には、1行目の代わりに次のように書くとよい。
fnsave = Application.GetSaveAsFilename(“出力結果.txt”, “テキスト(*.txt),*.txt”)
If fnsave = False Then Exit Sub
普通、Excelのマクロは、ボタンを押したり、メニューから選択したときに実行されます。
ワークシートが変わったときに自動的にマクロを実行するようにすることもできます。
その方法は次の通りです。
- 開発-VisualBasicを開く。
- プロジェクトエクスプローラ(左側)で、該当のシートをダブルクリック。
- コード(右側)のオブジェクト(「(General)」となっている)から「Worksheet」を選択。
- プロシージャ(「(Declarations)」となっている)から「Change」を選択。
- コードを書く。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 3 And Target.Column = 8 Then
Call プロシージャ
End If
End Sub
このように書くと3行目8列目のセルが変わったときに指定したプロシージャが動作します。
もしIfを使わないとそのシートのどこかのセルが変わったときに動作します。何かをやる度にプロシージャが動作してしまうので意図しない動きをするかもしれません。
Excelで日付や時刻の表示形式を整えるワークシート関数に「TEXT」があります。これに対応するのが、VBAでは「Format」。
「Format」の方が指定できる書式が多いです。
VBAの「Format」にあってワークシート関数の「TEXT」にない書式は次の通り。
| 文字 |
内容 |
| c |
ddddd および t t t t t の書式で表した日付と時刻を、日付、時刻の順序で返します。指定された値に小数部がない場合は日付のみ、整数部がない場合は時刻のみを表す文字列を返します。 |
| w |
曜日を表す数値を返します (日曜日が 1、土曜日が 7 となります)。 |
| ww |
その日が一年のうちで何週目に当たるかを表す数値を返します (1 ~ 54)。 |
| oooo |
月の名前を日本語で返します (1 月 ~ 12 月)。 |
| q |
1 年のうちで何番目の四半期に当たるかを表す数値を返します (1 ~ 4)。 |
| n |
分を返します。1 桁の場合、先頭に 0 が付きません (0 ~ 59)。 |
| nn |
分を返します。1 桁の場合、先頭に 0 が付きます (00 ~ 59)。 |
| t t t t t |
コントロール パネルで設定されている形式で時刻を返します。先頭に 0 を付けるオプションが選択されていて、時刻が午前または午後 10 時以前の場合、先頭に 0 が付きます。既定の形式は、h:mm:ss です。 |
ExcelのDATEDIF関数は今一つ挙動不審なので使わないようにしていたのですが、具体的なバグについて今頃、知りました。
使っていないから自分で気付くはずがないのですが。
このバグは有名なのだそうですが、修正されていません。
マイクロソフトはこれをExcelの正式なワークシート関数として取り扱っていないからでしょう。
確かにExcel2007のヘルプを見てもDATEDIFは見付かりません。 続きを読む…
二つの現象、データに相関関係があるかどうかを数学的に求めることができ、相関係数と言います。
計算は面倒なのですが、Excelに「CORREL」というワークシート関数があり、これを使えば簡単に求められます。 続きを読む…
以前のバージョンではありましたが、Excel2007ではカメラ機能が見当たりません。
カメラ機能というのはセルの状況を図として貼り付ける方法です。
セルの枠を無視して貼り付けることができるので、マニュアルなどを作る時に便利です。
もし、この方法を使わないとPrintScreenなどを使い、一度、画像にしてから、貼り付ける必要があり、面倒。
Excel2007では次のようにすれば使うことができます。
対象となるセルを選択。
コピー。
貼り付けたい場所をクリック。
リボンのホームの左端に「貼り付け」が表示されているので、下向き三角をクリック。
「図」-「図として貼り付け」を選択。
「図のリンク貼り付け」を選択すると、元のセルの値を変えると連動して貼り付け先の図も変わります。
この機能を頻繁に使うという場合にはクイックアクセスツールバーにアイコンをセットすることができます。
オフィスボタンを右クリック。
「クイックアクセスツールバーのカスタマイズ」を選択。
「コマンドの選択」で「リボンにないコマンド」を選択。
あいうえお順に並んでいるので「カメラ」を探し、追加をクリック。
これでクイックアクセスツールバーに「カメラ」のアイコンが追加されます。
たとえば、エクセルで次のような表があった場合、地域コード別に改ページを挿入したい、とします。
| 通番 |
地域コード |
支店コード |
| 1 |
100 |
1220 |
| 2 |
100 |
1420 |
| 3 |
200 |
2358 |
| 4 |
200 |
2306 |
| 5 |
300 |
3243 |
地域コードは昇順でソートするものとして、その境目に改ページを挿入すればよいのですが、大量にある場合には面倒。
これをマクロで実行する場合のVBAは次の通りです。 続きを読む…
Excelの次のような表をJSON形式にするVBAです。
| id |
name |
date |
| 1 |
a1 |
20081010 |
| 2 |
a2 |
20081011 |
| 3 |
a3 |
20081012 |
| 4 |
a4 |
20081013 |
| 5 |
a5 |
20081014 |
| 6 |
a6 |
20081015 |
| 7 |
a7 |
20081016 |
| 8 |
a8 |
20081017 |
| 9 |
a9 |
20081018 |
| 10 |
a10 |
20081019 |
新しいシートを開き、そこにJSON形式のテキストを出力します。 続きを読む…
Excelで列を非表示にしたいときは、列を選択してから、[書式]-[列]-[表示しない]を選択しますが、この場合、再表示が面倒です。
頻繁に表示と非表示を切り替える場合には次のとおり「列のグループ化」を使うとよいです。
- 非表示にしたい列を選択する。
- [データ]-[グループとアウトラインの設定]-[グループ化]を選択する。
こうするとシートの上の部分に「+」マークが表示され、クリックすると列が表示され、マークが「-」になり、またクリックすると列が非表示になります。
最近のコメント