オフィス・ブールはExcel(エクセル)VBAでみなさまのお仕事をお手伝いします
オフィス・ブール ロゴ
作 者 : Office Boole 末永尚登
E-mail : suenaga@officeboole.com
TEL   : 095-893-6090
FAX   : 095-893-6090
携 帯 : 070-4087-0025



title

(さあ困った、どうしよう?というときどうぞ)
VBA2編 フォルダを指定してダイアログを表示したいとき
データが入力されているセル幅を自動調節したいとき
テキストファイルを読み書きしたいとき
文字列を選択状態にしたいとき
シート行の最大値65536を使わずにデータの最後行を取得
フォームを表示した状態でワークシートをスクロールさせたいとき
ファイル名を変更(リネーム)したいとき
ユーザーフォームを任意の位置に表示したいとき
拡張子を特定してファイル一覧を取得したいとき
InputBox関数で押されたボタンを識別したいとき
InputBox関数で文字のみ入力を可能としたいとき

Excel編へ

●フォルダを指定してダイアログを表示したいとき

通常「ファイルを開くダイアログ」を表示した場合、「ツール」→「オプション」のExcelのカレントフォルダ欄に設定されたフォルダが最初に開きます。
これを任意のフォルダを指定して開くようにするには、組み込みダイアログを利用して次のように引数にパスを指定することで簡単に実現できます。
「キャンセル」ボタンが押された場合の処理も考えなければいけない場合は、戻り値(TrueかFalse)で判断してOpen2のようにすればよいでしょう。
起点フォルダの指定方法については、現在のブックと同じ場所を開きたいならThisWorkbook.Pathとし、特定の場所を指定するなら"C:\"のようにすれば、そこから必ず開きます。
Public Sub Open1()

    Application.Dialogs(xlDialogOpen).Show _
        arg1:=ThisWorkbook.Path
        
End Sub

Public Sub Open2()

    Dim ret As Boolean
        
    ret = Application.Dialogs(xlDialogOpen).Show(ThisWorkbook.Path)
    If ret = False Then Exit Sub
    
End Sub
		


データが入力されているセル幅を自動調節したいとき

データが入力されている列に対して、そのセル幅を自動調節してくれます。
UsedRangeプロパティを使用することで、対象セル範囲を限定しています。
Public Sub AutoFitMac()
'セル幅を自動調節する

    ActiveSheet.UsedRange.EntireColumn.AutoFit

End Sub
		


テキストファイルを読み書きしたいとき

テキストファイルの読み書きは、VBのOpenステートメントを使用する方法とファイルシステムオブジェクトを利用する方法があります。
Openステートメントは古くから使われており、分かりやすいですが定型的な処理しかできません。
ファイルシステムオブジェクトの方は様々なメソッドやプロパティが用意されているので、もっと細かな処理ができます。
ここでは両方のコーディング例を掲載しています。
用途に応じて使い方を考えてみてください。
Public Sub ReadText1()
'   Openステートメントを使用
'   行単位で読み込み

    Dim FileNumber As Long
    Dim FilePath As String
    Dim TextLine As String
    Dim ar As Variant
    Dim i As Long
    Dim gyo As Long
    
    FileNumber = FreeFile
    FilePath = ThisWorkbook.Path & "\test.txt"

    Open FilePath For Input As #FileNumber
    
    gyo = 1
    Do While Not EOF(FileNumber)
        Line Input #FileNumber, TextLine
        ar = Split(TextLine, ",")
        For i = 0 To UBound(ar)
            Cells(gyo, i + 1).Value = ar(i)
        Next i
        gyo = gyo + 1
    Loop
    
    Close #FileNumber
    
End Sub

Public Sub ReadText2()
'   Openステートメントを使用
'   項目単位で読み込み

    Dim FileNumber As Long
    Dim FilePath As String
    Dim ar(1 To 7) As String
    Dim i As Long
    Dim gyo As Long
    
    FileNumber = FreeFile
    FilePath = ThisWorkbook.Path & "\test.txt"

    Open FilePath For Input As #FileNumber
    
    gyo = 1
    Do While Not EOF(FileNumber)
        Input #FileNumber, ar(1), ar(2), ar(3), ar(4), ar(5), ar(6), ar(7)
        For i = 1 To UBound(ar)
            Cells(gyo, i).Value = ar(i)
        Next i
        gyo = gyo + 1
    Loop
    
    Close #FileNumber

End Sub



Public Sub ReadText3()
'   FileSystemObjectを利用
'   テキストファイルの読み込み(行単位、カンマ区切り)

    Dim FSO As Object
    Dim TSO As Object
    Dim TextLine As String
    Dim FilePath As String
    Dim ar As Variant
    Dim i As Long
    Dim gyo As Long
    
    FilePath = ThisWorkbook.Path & "\test.txt"

    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    gyo = 0
    Set TSO = FSO.GetFile(FilePath).OpenAsTextStream
    With TSO
        Do Until .AtEndOfLine
            TextLine = .ReadLine
            gyo = gyo + 1
            ar = Split(TextLine, ",")
            For i = 0 To UBound(ar)
                Cells(gyo, i + 1).Value = ar(i)
            Next i
        Loop
        .Close
        
    End With
    
End Sub

Public Sub ReadText4()
'   FileSystemObjectを利用
'   テキストファイルの読み込み(行単位、タブ区切り)

    Dim FSO As Object
    Dim TSO As Object
    Dim TextLine As String
    Dim FilePath As String
    Dim ar As Variant
    Dim i As Long
    Dim gyo As Long
    
    FilePath = ThisWorkbook.Path & "\test.txt"

    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    gyo = 0
    Set TSO = FSO.GetFile(FilePath).OpenAsTextStream
    With TSO
        Do Until .AtEndOfLine
            TextLine = .ReadLine
            gyo = gyo + 1
            ar = Split(TextLine, vbTab)
            For i = 0 To UBound(ar)
                Cells(gyo, i + 1).Value = ar(i)
            Next i
        Loop
        
        .Close
        
    End With

End Sub

Public Sub WriteText1()
'   Openステートメントを使用
'   テキストファイルの書き込み(行単位、上書き)

    Dim FileNumber As Long
    Dim FilePath As String
    Dim TextLine As String
    Dim gyo As Long
    
    FileNumber = FreeFile
    FilePath = ThisWorkbook.Path & "\test.txt"

    Open FilePath For Output As #FileNumber
    
    gyo = 1
    Do While Cells(gyo, 1).Value <> ""
        TextLine = Cells(gyo, 1).Value
        Print #FileNumber, TextLine
        gyo = gyo + 1
    Loop
    
    Close #FileNumber

End Sub


Public Sub WriteText2()
'   Openステートメントを使用
'   テキストファイルの書き込み(行単位、追記)

    Dim FileNumber As Long
    Dim FilePath As String
    Dim TextLine As String
    Dim gyo As Long
    
    FileNumber = FreeFile
    FilePath = ThisWorkbook.Path & "\test.txt"

    Open FilePath For Append As #FileNumber
    
    gyo = 1
    Do While Cells(gyo, 1).Value <> ""
        TextLine = Cells(gyo, 1).Value
        Print #FileNumber, TextLine
        gyo = gyo + 1
    Loop
    
    Close #FileNumber

End Sub

Public Sub WriteText3()
'   Openステートメントを使用
'   テキストファイルの書き込み(項目単位、上書き)

    Dim FileNumber As Long
    Dim FilePath As String
    Dim gyo As Long
    
    FileNumber = FreeFile
    FilePath = ThisWorkbook.Path & "\test.txt"

    Open FilePath For Output As #FileNumber
    
    gyo = 1
    Do While Cells(gyo, 1).Value <> ""
        Write #FileNumber, Cells(gyo, 1).Value, Cells(gyo, 2).Value
        gyo = gyo + 1
    Loop
    
    Close #FileNumber

End Sub

Public Sub WriteText4()
'   FileSystemObjectを利用
'   テキストファイルの書き込み(行単位、カンマ区切り)

    Dim FSO As Object
    Dim OSB As Object
    Dim FilePath As String
    Dim gyo As Long
    
    FilePath = ThisWorkbook.Path & "\test.txt"

    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    '2:上書きモード TRUE:ファイルが存在しなければ新規作成
    Set OSB = FSO.OpenTextFile(FilePath, 2, True)
    
    gyo = 1
    Do Until Cells(gyo, 1).Value = ""
        OSB.WriteLine Cells(gyo, 1).Value & "," & Cells(gyo, 2).Value
        gyo = gyo + 1
    Loop
    
    OSB.Close

End Sub
		
		


文字列を選択状態にしたいとき

テキストボックスに入力した値をチェックして、エラーの場合その文字列を選択状態(反転表示)にさせてオペレータに知らせたい場合に便利です。
このサンプルコードは、ユーザーフォームにTextBox1が配置してあり、そのボックスに入力された文字列をコマンドボタンで選択状態にする例です。
実際はエラーチェックルーティンと組み合わせて使われることが多いと思います。
SelStartプロパティは文字列をどの位置から選択するのかを指定し、SelLengthプロパティで選択範囲の長さを指定します。
この例ではLen関数でテキストボックスに入力されている文字列の長さを調べ、その値をSelLengthプロパティに設定しています。
Private Sub CommandButton1_Click()

    'テキストボックスに入力された
    '文字列を選択状態にする

    With TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Value)
    End With
    
End Sub		
		


シート行の最大値65536を使わずにデータの最後行を取得

データの最後の行を求める場合、ワークシートの最大行番号65536行を指定して、そこから上に探索する方法が一般的です。
《例》EndRow = Sheet1.Range("A65536").End(xlUp).Row
しかし、これだとExcelの仕様が変わり、最大行が65536行でなくなった場合に問題が発生することが予想されます。
そこまで考えるなら次のコードのように変更すれば、大丈夫でしょう。
シートの最大値をコードで取得して、その値から上方に調べていくやり方です。
Dim RowsCount As Long
Dim EndRow As Long
    
With Worksheets("Sheet1")
    RowsCount = .Rows.Count
    EndRow = .Range("A" & RowsCount).End(xlUp).Row
End With
		


フォームを表示した状態でワークシートをスクロールさせたいとき

通常はフォームを表示する場合はUserForm1.Showと記述しますので、モーダルフォームとなり、フォーム以外での操作は受け付けられなくなります。
他の操作(ワークシートのスクロールなど)を行いたいときは、いったんフォームを閉じてから操作をしなければなりません。
しかしフォームをモードレス状態で開くと、フォームが表示されていても後ろにあるワークシートを触れるようになります。もちろんスクロールも自由自在です。
このようにモーダルフォームとは、そのフォームを閉じない限り他の操作ができないものを言い(アプリケーション内の他のフォームは無効になりますが、他のアプリケーションのフォームは有効です)、モードレスフォームとは、そのフォームを閉じなくても、別なオブジェクトを操作することができるものをいいます。
VBAではShowメソッドの引数にvbModelessを指定すれば、モードレスフォームとなります。
ただしOffice 97では、ユーザーフォームは常にモーダルでしか表示できません。
Public Sub callfrom()

    UserForm1.Show vbModeless
    
End Sub		
		


ファイル名を変更(リネーム)したいとき

ファイル名またはフォルダ名の名前を変更するにはNameステートメントを使います。
また、ファイル名を変更して、他のフォルダにファイルを移動させることもできます。
まず最初にMotoFileで名前を変更するファイル名を指定します。
次にNewFileで新しいファイル名を指定します。
どちらもフルパス(ドライブ名及びフォルダ名を含める)で記述してください。
ただしNewFileには、既に存在しているファイル名は指定できません。実際に運用する場合にはエラートラップが必要となります。
またNameステートメントは、ドライブ間ではファイルを移動しますが、MotoFileとNewFileで指定したドライブ名が同じ場合は、単に既存のフォルダの名前を変更します。
ファイルやフォルダを新しく作成することはできません。
現在、開いているファイルに対してNameステートメントを実行してもエラーにはなりませんが、内容を変更した場合は、閉じる際に「名前を付けて保存」になります。
さらにDOSコマンドのように (*) や (?) のワイルド カード文字が指定できないので、場合によっては自分で処理を付け加える必要があるでしょう。
Public Sub Rename()
    'ファイル名を付け替える(リネーム)

    Dim MotoFile As String
    Dim NewFile As String
    MotoFile = ThisWorkbook.Path & "\" & "old.txt"
    NewFile = ThisWorkbook.Path & "\" & "new.txt"
    Name MotoFile As NewFile

End Sub

		


ユーザーフォームを任意の位置に表示したいとき

ユーザーフォームを任意の位置に表示する場合は、まずユーザーフォームのStartUpPositionプロパティを0(手動)に設定します。
そのあとでTopとLeftプロパティに任意の座標を指定します。
設定は下の例のようにVBAで設定するか、または直接プロパティウィンドから設定してもかまいません。
Public Sub CallMenu()

    With UserForm1
        .StartUpPosition = 0
        .Top = 100
        .Left = 23
        .Show
    End With

End Sub

		


拡張子を特定してファイル一覧を取得したいとき

フォルダ内のファイル一覧を取得する方法についてはネット上にたくさん紹介されていますが、一番シンプルな方法を掲載しておきます。
サブフォルダも含めた一覧取得となると、かなり難しくなってきます(プロシージャの再帰呼出し等)ので他サイトで調べてください。
サンプルはマクロブックが置かれたフォルダにあるエクセルブックの一覧を取得できます。
Public Sub GetFileList()

    Dim myDir As String
    Dim i As Long
    
    '出力先ワークシートをクリア
    Cells.ClearContents
    
    '拡張子xlsのファイル一覧を取得する
    myDir = Dir(ThisWorkbook.Path & "\" & "*.xls", vbNormal)
    Do While myDir <> ""
        i = i + 1
        Cells(i, 1).Value = myDir
        myDir = Dir()
    Loop
    
End Sub

		


InputBox関数で押されたボタンを識別したいとき

InputBox関数で押されたボタンによる処理の分岐は、初心者にとって案外難しいものです。
ここではVBAの非表示メンバStrPtr関数を使って判定しています。
Public Sub InputCheck()

    Dim rs As String
    
    rs = InputBox("データを入力してください")
    
    If StrPtr(rs) = 0 Then
        MsgBox "「キャンセル」ボタンが押されました"
        Exit Sub
    Else
        MsgBox "「OK」ボタンが押されました"
    End If
    
End Sub
		
		


InputBox関数で文字のみ入力を可能としたいとき

入力された値が文字か数字かを判断するにはIsNumeric関数を使うと簡単です。 数字の場合はTrueが返されるので、Falseのときだけループを抜けるようにします。
キャンセルボタンが押されたとき、または何も入力しないでOKボタンを押したときは処理を中止します。
Public Sub GetOnlyChar()

    Dim rs As String
    
    Do
       rs = InputBox("文字のみ入力してください")
       If rs = "" Then Exit Sub
    Loop While IsNumeric(rs)
    MsgBox rs & "が入力されました。"
    
End Sub
		
		


 


office boole banner 長崎県長崎市 オフィス・ブール 末永
E-mail: suenaga@officeboole.com   Tel: 095-893-6090  Fax: 095-893-6090