エクセル小技

| メイン |


■第2回:ファイル選択ダイアログの操作

説明:
EXCELからテキストファイルを入力したり、他のEXCELを操作する場合
ファイル選択ダイアログを表示して対象となるファイルを選択する事
ができます。
また逆に作成したテキストファイルを保存する場合にはファイル保存
ダイアログを表示して保存するファイルを設定できます。
使用例:

Option Explicit

‘———————————————————–
‘ [開く]ボタン押下時
‘———————————————————–
Sub ボタン1_Click()
Dim Path   As String
Dim Record As String
‘————————————–
‘ 入力ファイル選択
‘————————————–
InputFilePath = OpenDialog
‘————————————–
‘ テキストファイルの入力
‘————————————–
Open InputFilePath For Input As 1
While Not EOF(1)
Line Input #1, Record
:
Wend
Close 1
End Sub

‘———————————————————–
‘ [保存]ボタン押下時
‘———————————————————–
Sub ボタン2_Click()
Dim Path As String
Dim Record As String
‘————————————–
‘ 出力先ファイル設定
‘————————————–
Path = SaveDialog
if Path <> “” Then
‘———————————-
‘ テキストファイルの出力
‘———————————-
Open FilePath For Output As 1
Print #1, Record
Close 1
End If
End Sub
‘———————————————————–
‘ 入力用ファイル選択ダイアログ
‘———————————————————–
Private Function OpenDialog() As String
Dim InputFilePath As String
InputFilePath = Application.GetOpenFilename(”CSVファイル,*.csv”, , _
“入力ファイルを指定してください”)
If InputFilePath = “False” Then InputFilePath = “”
OpenDialog = InputFilePath
End Function
‘———————————————————–
‘ 出力用ファイル選択ダイアログ
‘———————————————————–
Private Function SaveDialog() As String
Dim OutputFilePath As String
OutputFilePath = Application.GetSaveAsFilename(OutputFilePath, _
, , “出力先ファイルを指定してください”)
If OutputFilePath = “False” Then  OutputFilePath = “”
if OutputFilePath <> “” Then
If Dir(OutputFilePath) <> “” Then
‘ ファイルが存在するかを確認
If MsgBox(OutputFilePath & “は既に存在します。上書きしますか?”, vbYesNo) = vbNo Then
MsgBox “処理が中断されました。”
OutputFilePath = “”
End If
End If
End If
SaveDialog = OutputFilePath
End Function

———————————–
解説:Application.GetOpenFilename
———————————–
ユーザーからファイル名を取得するために、[ファイルを開く] ダイアログ
ボックスを表示します。
ダイアログ ボックスで指定したファイルは、実際には開かれません。

書式:
expression.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

expression
・必ず指定します。Application オブジェクトを返す
オブジェクト式を指定します。
FileFilter
・省略可能です。バリアント型 (Variant) の値を使用します。
・ファイルの候補を指定する文字列(ファイル フィルタ文字列)を
指定します。
・ファイル フィルタ文字列とワイルドカードのペアを、必要な数
だけ指定します。
・ファイル フィルタ文字列とワイルドカードはカンマ (,) で区切り、
各ペアもカンマで区切って指定します。
各ペアは、[ファイルの種類] ボックスのリストに表示されます。
例えば、テキストとアドインの 2 つのファイル フィルタの指定は
次のようになります。
“テキストファイル (*.txt),*.txt,アドインファイル (*.xla),*.xla”
・1 つのファイル フィルタ文字列に複数のワイルドカードを
対応させるには、次のように各ワイルドカードをセミコロン(;)で
区切ります。
“Visual Basic ファイル (*.bas;*.txt),*.bas;*.txt”
・この引数を省略すると、”すべてのファイル (*.*),*.*” を指定した
ことになります。

FilterIndex
・省略可能です。バリアント型 (Variant) の値を使用します。
・引数 FileFilter で指定したファイル フィルタ文字列の中で、
1 から何番目の値を既定値とするかを指定します。
・この引数を省略するか、引数 FileFilter に含まれる
ファイル フィルタ文字列の数より大きい数値を指定すると、
最初のファイル フィルタ文字列が既定値となります。

Title
・省略可能です。バリアント型 (Variant) の値を使用します。
・ダイアログ ボックスのタイトルを指定します。
この引数を省略すると “ファイルを開く” になります。

ButtonText
・省略可能です。バリアント型 (Variant) の値を使用します。
Macintosh でのみ指定できます。

MultiSelect
・省略可能です。バリアント型 (Variant) の値を使用します。
True を指定すると、複数のファイルを選択できます。
False を指定すると、1 つのファイルしか選択できません。
・既定値は False です。

説明:
GetOpenFilename メソッドは、ユーザーによって選択、または
入力されたファイルの名前とパス名を返します。
引数 MultiSelect が True の場合は、選択されたファイルの名前の
配列が返されます。
選択されたファイルが 1 つでも、配列として返されます。
入力が取り消された場合には False が返されます。
このメソッドを実行することによって、カレント ドライブや
カレント フォルダが変更される可能性があります
———————————–
解説:Application.GetSaveAsFilename
———————————–
ユーザーからファイル名を取得するために、[名前を付けて保存] ダイアログ
ボックスを表示します。
ダイアログ ボックスで指定したファイルは、実際には保存されません。

書式:
expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)

expression
・必ず指定します。Application オブジェクトを返すオブジェクト式を
指定します。

InitialFilename
・省略可能です。バリアント型 (Variant) の値を使用します。
・既定値として表示するファイル名を指定します。
・この引数を省略すると、作業中のブックの名前が使われます。

FileFilter
・省略可能です。バリアント型 (Variant) の値を使用します。
・ファイルの候補を指定する文字列 (ファイル フィルタ文字列) を
指定します。
・ファイル フィルタ文字列とワイルドカードのペアを、必要な
数だけ指定します。
・ファイル フィルタ文字列とワイルドカードはカンマ (,) で区切り、
各ペアもカンマで区切って指定します。
・各ペアは、[ファイルの種類] ボックスのリストに表示されます。
・例えば、テキストとアドインの 2 つのファイル フィルタの指定は
次のようになります。
“テキストファイル (*.txt),*.txt,アドインファイル (*.xla),*.xla”
・1 つのファイル フィルタ文字列に複数のワイルドカードを
対応させるには、次のように各ワイルドカードをセミコロン(;)で
区切ります。
“Visual Basic ファイル (*.bas;*.txt),*.bas;*.txt”
・この引数を省略すると、”すべてのファイル (*.*),*.*” を指定した
ことになります。

FilterIndex
・省略可能です。バリアント型 (Variant) の値を使用します。
・引数 FileFilter で指定したファイル フィルタ文字列の中で、
1 から何番目の値を既定値とするかを指定します。
・この引数を省略するか、引数 FileFilter に含まれるファイル
フィルタ文字列の数より大きい数値を指定すると、最初のファイル
フィルタ文字列が既定値となります。

Title
・省略可能です。バリアント型 (Variant) の値を使用します。
・ダイアログ ボックスのタイトルを指定します。
・この引数を省略すると、”名前を付けて保存” になります。

ButtonText
・省略可能です。バリアント型 (Variant) の値を使用します。
Macintosh でのみ指定できます。

説明:
このメソッドは、ユーザーによって選択または入力されたファイルの名前と
パス名を返します。
入力が取り消された場合には False が返されます。
このメソッドを実行することによって、カレント ドライブやカレント
フォルダが変更される可能性があります。

この記事へ

エクセル小技・豆知識

これから少しずつ、エクセル小技豆知識をご紹介します。今まで困っていた作業がカンタンに片付くかも知れません。是非、お試しください。

説明:
    通常、EXCELのマクロを実行すると対象となっているEXCELシートへの修正がリアルタイムに反映され、シート間のデータコピーなどを行うと、とても見られたものではありません。そのため、処理が終了するまでEXCELシートの(表示上の)更新を抑制する方法が「Application.ScreenUpdating」の利用となります。

使用例:
    下記例はシートの切り替えを行う極端な例です。

Option Explicit

‘—————————————————–
‘   Application.ScreenUpdating の使用例
‘—————————————————–
Sub Macro1()
    Dim Row As Integer
    Dim Value As Integer
    ‘—————————————————–
    ‘ リアルタイムにEXCEL画面を更新する
    ‘   本コマンドを指定しない、またはTrueを指定すると
    ‘   以下の例ではリアルタイムにEXCELのシートへ値を
    ‘   設定していくところが見える。
    ‘     デバッグ時にはよいが、実行スピードが遅い

    ‘ 画面更新を有効にする
    Application.ScreenUpdating = True

    ‘ 出力列をクリア
    Sheets(”Sheet2″).Select             ‘ コピー先のシートに切り替え
    Columns(”A:E”).Select               ‘ A~E列全体を選択
    Selection.ClearContents             ‘ 選択範囲内をクリア
    Range(”A1″).Select                  ‘ シートの左上に戻る
    Sheets(”Sheet1″).Select             ‘ コピー元のシートに切り替える

    ‘ セルに数値を設定
    For Row = 1 To 1000
        With Sheets(”Sheet1″)
            .Select                     ‘ コピー元のシートに切り替える
            .Cells(Row, 1) = Row        ‘ Row行1列にRowの値を設定
            Value = .Cells(Row, 1)      ‘ ValueにRow行1列の値を退避
        End With
        With Sheets(”Sheet2″)
            .Select                     ‘ コピー先のシートに切り替える
            .Cells(Row, 1) = Value      ‘  Row行1列にValueの値を設定      End With
    Next

    ‘—————————————————–
    ‘ Macro実行中にEXCEL画面を更新しない
    ‘   本コマンドでFalseを指定すると本マクロ実行中は
    ‘   EXCELシートに変化は起きず、マクロ終了後に
    ‘   値が設定されたシートが表示される。
    ‘     実行スピードが早い

    ‘ 画面更新を無効にする
    Application.ScreenUpdating = False

    ‘ 出力列をクリア
    Sheets(”Sheet2″).Select             ‘ コピー先のシートに切り替え
    Columns(”A:E”).Select               ‘ A~E列全体を選択
    Selection.ClearContents             ‘ 選択範囲内をクリア
    Range(”A1″).Select                  ‘ シートの左上に戻る
    Sheets(”Sheet1″).Select             ‘ コピー元のシートに切り替える

    ‘ セルに数値を設定
    For Row = 1 To 1000
        With Sheets(”Sheet1″)
            .Select                     ‘ コピー元のシートに切り替える
            .Cells(Row, 1) = Row        ‘ Row行1列にRowの値を設定
            Value = .Cells(Row, 1)      ‘ ValueにRow行1列の値を退避
        End With
        With Sheets(”Sheet2″)
            .Select                     ‘ コピー先のシートに切り替える
            .Cells(Row, 1) = Value      ‘ Row行1列にValueの値を設定
        End With
    Next

End Sub
実際には以下のように個々のセルをシート名で修飾すればシート切り替えは発生しませんが、画面更新を無効にすることにより処理速度の向上が見込まれます。

Sub Macro2()
    Dim Row As Integer

    ‘ 画面更新を無効にする
    Application.ScreenUpdating = False

    ‘ 出力列をクリア
    Sheets(”Sheet2″).Select             ‘ コピー先のシートに切り替え
    Columns(”A:E”).Select               ‘ A~E列全体を選択
    Selection.ClearContents             ‘ 選択範囲内をクリア
    Range(”A1″).Select                  ‘ シートの左上に戻る
    Sheets(”Sheet1″).Select             ‘ コピー元のシートに切り替える

    ‘ セルに数値を設定
    For Row = 1 To 1000
        Sheets (”Sheet1″)
            .Cells(Row, 1) = Row        ‘ Row行1列にRowの値を設定
            Value = .Cells(Row, 1)      ‘ ValueにRow行1列の値を退避
        End With
        With Sheets(”Sheet2″)
            .Cells(Row, 1) = Value      ‘ Row行1列にValueの値を設定
        End With
    Next
End Sub

この記事へ

| メイン |

お知らせ

お知らせトップ

最近の記事
カテゴリー別に見る
月別に見る

 

テンリクスピードバナー

 

マイナビ2020

 

oshigotonagano

 

syukatsunavi2020_bn