2024年11月21日木曜日

vba ファイルのフルパスはApplication.GetOpenFilenameでゲットせよ

taka-skull

 vbaでファイルを扱うツールを作成する場合、入力となるファイルをmenuシートの特定セル(例えば、A10セル)にフルパスで書いてもらうといった作りになる。  ところが、フルパスのファイル名を指定することは、長々と文字列を書くことになり、意外と面倒くさい。そこで、A10セルの隣のセルに(ファイル)選択とか(フォルダ)参照とかいったボタンを作成し、サクッとGUI画面で設定できるようにしたい。
それを実現するため、ファイル選択ダイアログ(GUIだ)でファイルを選択し、そのファイルのフルパスを取得し、A10セルに設定するコードを書く。こんな感じで。  このコードを選択ボタン或いは参照ボタンにマクロ登録すれば、もう、完成だ。




Sub GetFileName()
Dim FileName as Variant
   FileName = Application.GetOpenFilename("Microsoft Excelブック,*.xlsx?")
   If FileName = False Then Exit Sub
   Range("A10").Value =  FileName 
End Sub
フォルダ選択ダイアログFileDialogとDir関数、ワイルドカード「*」を使う方法もある。

2024年11月15日金曜日

vbaでシートの特定の列だけコピーするは、不要な行は非表示にしてコピペすると良い。

vbaでシートの特定の列だけコピーするのは、全ての列を一旦、非表示にする。そして、必要な列だけを表示し、コピペする。と良い。とりわけ、ある条件でフィルターした結果だけをコピペする場合に具合がよろしい。

 Columns("A:Z").hidden = True  'A列からZ列を非表示にする
 Columns("A:D").hidden = False  ’A列からD列を表示する
 Range("A:Z").SpecialCells(xlCellTypeVisible).Copy Range("A1")

vbaで列の削除は一発でやれ

複数行の削除は、1行ずつやると、意図した行を消せないので、一発でやること。
 Columns("A:A,C:C,E:E,G:J").deleteで列削除は一発でやること。
 ちまちまと、Columns("A:A").Delete、次にColumns("C:C").Deleteとやると、意図した行が削除できない。

vbaで「インデックスが有効範囲にありません。」というエラーが出た時にはスペルミスを疑え

シート名やブック名に誤りがあると「インデックスが有効範囲にありません。」という謎のエラーが出る。ことがまま、ある。そういうとき、大体、スペルミスをしている。

vbaでシートをcopyすると、新ブックのシートにコピーされる、ActiveSheetはコピーされたシートになる。そして、新ブックをcloseすると、元のシートがアクティブになる。

アクティブシートは、スタックされている。新しいブックがcloseすれば、元のシートがアクティブになる。
 今、どのシートがアクティブなのかを把握していないと、プログラムは暴走し始める。

vbaをデバッグするときの作法について(how to debug for vba)

vbaのデバッグに便利なコマンド

  • イミディエイト・ウィンドウで、?ActiveSheet.Nameでアクティブシート名を出力する。
  • イミディエイト・ウィンドウで、?ActiveWorkBook.Nameでアクティブブック名を出力する。
  • イミディエイト・ウィンドウで、?Sheet("シート名").Range("A1").CurrentRegion.addressでセル範囲のアドレスを出力する。
  • ちょいちょいdebug.printせよ