経理部員のプログラミング勉強日記

経理、プログラミング、データ分析などを生業にする30代男性会社員の行動記録です。

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
続きを読む

VBAエキスパート(ExcelVBAスタンダード)サンプル問題その1

Sub Sample()
Worksheets.Add.Name = "埼玉"
End Sub

シートを追加しそのシート名を"埼玉"に変更するマクロ。
★には何が入るかという問題。

続きを読む

Excel関数 VLOOKUP関数がうまく機能しない場合のありがちな原因 ~表示形式とデータ型~

「VLOOKUP関数を使っているんだけど、検索値がマスタにあるのにエラーが出てしまう」

こういう質問をいただくことがあります。

一番ありがちなのは、VLOOKUP関数の1番目の引数で指定する「検索値」と2番目の引数で指定するデータ範囲の左端のデータ型がずれているケースです。


検索値:数値型 ⇔ データ範囲の左端:文字列型

         または、

検索値:文字列型 ⇔ データ範囲の左端:数値型

このような場合は、両方とも数値型または文字列型に揃えれば解決します。
そう言うと、
「どちらも文字列にしているのにうまくいかない」と言われてしまうことがあります。

ありがちなのは、表示形式を文字列にしているだけでデータ型が文字列型になっていないケースです。表示形式とデータ型は別物ですので注意しましょう。必ずデータ型を揃える必要があります。

さて、文字列型を数値型にするのはわりとカンタンなのですが、
数値型を文字列型にするのは少しめんどうです。
やり方は2種類あります。

 ①TEXT関数を使う
 ②区切位置指定ウィザードを使う

①は「=TEXT(A1,0)」のようにして、数値型を文字列型にしたセルをコピーし、
形式を選択して「値」として貼り付けすることで、データ型を文字列型にすることができます。

②は使っている人が少ないような気もしますが①よりもカンタンです。
まず文字列型したいセルの範囲を選択し「区切位置指定ウィザード」を表示します。
f:id:youhei9999:20180316000419p:plain

「次へ」をクリックします。
f:id:youhei9999:20180316000603p:plain

さらに「次へ」をクリックします。
f:id:youhei9999:20180316000629p:plain

データ形式に「文字列」を選択して「完了」をクリックします。
f:id:youhei9999:20180316000640p:plain

これでデータ型が文字列型になります。
f:id:youhei9999:20180316000737p:plain

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プロパティで初期表示するアイテムを指定する。

f:id:youhei9999:20180312230837p:plain

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