【四コマ漫画】かいてんドア
むかしに作った四コマ漫画。
VBAエキスパート(ExcelVBAスタンダード)サンプル問題その3
【問題】
下記のプロシージャ「test」を実行したとき、
メッセージボックスで表示される文字列は何か。
Sub test() Dim buf As String buf = "エクセル" Call test2(buf) MsgBox buf End Sub Sub test2(ByRef buf2 As String) buf2 = "ワード" End Sub続きを読む
Excel関数 VLOOKUP関数がうまく機能しない場合のありがちな原因 ~表示形式とデータ型~
「VLOOKUP関数を使っているんだけど、検索値がマスタにあるのにエラーが出てしまう」
こういう質問をいただくことがあります。
一番ありがちなのは、VLOOKUP関数の1番目の引数で指定する「検索値」と2番目の引数で指定するデータ範囲の左端のデータ型がずれているケースです。
検索値:数値型 ⇔ データ範囲の左端:文字列型
または、
検索値:文字列型 ⇔ データ範囲の左端:数値型
このような場合は、両方とも数値型または文字列型に揃えれば解決します。
そう言うと、
「どちらも文字列にしているのにうまくいかない」と言われてしまうことがあります。
ありがちなのは、表示形式を文字列にしているだけでデータ型が文字列型になっていないケースです。表示形式とデータ型は別物ですので注意しましょう。必ずデータ型を揃える必要があります。
さて、文字列型を数値型にするのはわりとカンタンなのですが、
数値型を文字列型にするのは少しめんどうです。
やり方は2種類あります。
①TEXT関数を使う
②区切位置指定ウィザードを使う
①は「=TEXT(A1,0)」のようにして、数値型を文字列型にしたセルをコピーし、
形式を選択して「値」として貼り付けすることで、データ型を文字列型にすることができます。
②は使っている人が少ないような気もしますが①よりもカンタンです。
まず文字列型したいセルの範囲を選択し「区切位置指定ウィザード」を表示します。
「次へ」をクリックします。
さらに「次へ」をクリックします。
データ形式に「文字列」を選択して「完了」をクリックします。
これでデータ型が文字列型になります。
ExcelVBA 仕訳帳から特定の勘定科目をフィルタ抽出して別のファイルに切り出すマクロ
一番左のシートに仕訳帳などを貼る(8列目が勘定科目名であることを想定)。
2番目のシートには抽出対象の勘定科目をマスタにしておく。
出力するファイルは重複を避けるためファイル名に現在日時をつける。
Sub 複数のブックに分割() Dim フォルダ, セル, ブック, 今 As String 今 = Format(Now, "yyyymmddhhmmss") Application.ScreenUpdating = False With ThisWorkbook フォルダ = .Path For Each セル In .Worksheets(2).Range("A2:A18") 'ブランクが出てきたらfor文を抜けて終了 If セル = "" Then Exit For .Worksheets(1).Range("A1").AutoFilter 8, セル.Value Set ブック = Workbooks.Add .Worksheets(1).Range("A1").CurrentRegion.Copy ブック.Worksheets(1).Range("A1").PasteSpecial Application.CutCopyMode = False ブック.SaveAs フォルダ & "\" & 今 & セル.Value & ".xlsx" ブック.Close Next End With Application.DisplayAlerts = False ThisWorkbook.Close Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
ExcelVBA コンボボックスの初期設定と反転防止策
コンボボックスの初期値設定はInitializeイベントで行う。
AddItemメソッドでリストを作り、
ListIndexプロパティで初期表示するアイテムを指定する。
Private Sub UserForm_Initialize() With ComboBox1 .AddItem "1 上杉彰彦" .AddItem "2 高石梨紗" .AddItem "3 真壁七美" End With ComboBox1.ListIndex = 2 End Sub
コンボボックスは選択すると文字列が反転してしまって格好悪い。
回避策としてはChangeイベントで別のボタンなどにフォーカスを移してしまう。
Private Sub ComboBox1_Change() CommandButton1.SetFocus End Sub