• ベストアンサー

VBAでFileDialogを利用してファイル参照したいのですが

EXCEL2002、SP2上での質問です。 ユーザーフォームをVBAで作成中です。 主な機能は、区分をコンボボックスで選択させた上で、 取込みたいファイルを参照し、取込実行ボタンを押すという感じに 作っています。 質問は、取込みたいファイルを参照させ選択したあと、すぐに処理を 行うのではなく、一度参照した結果のフォルダー名とファイル名を 別の窓(ツールボックスのどのコントロールがベストチョイスか不明) に表示させ、取込実行ボタンでコンボボックスで選択した内容と 参照したファイルを取得するようにしたいのですが、別の窓に参照結果 を表示させる方法がわかりません。 説明が長くてわかりにくいと思いますが、参照ボタンの記述を下記に 記載しますので、参照後の処理をどのようにしたらよいか教えて 下さい。 Private Sub 参照_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub →ここに参照した後の処理を追加したいです。 End With End Sub

  • senho
  • お礼率47% (10/21)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 お仕事、大変ですね。Excelは、Excel独特の使い方のようなものがありますね。どちらかというと、今回の場合は、UserForm は、あまり使われないような気がします。何か、このままで行くと、とても、複雑になりつつあるような気がします。 >表示されているだけだと、ファイル名が指定されていませんに行ってしまいます。記述がたりないのでしょうか? 気が利かなくてすみません。たた、ひとつだけ表示されていたら、そのまま、指定されたことにして、file_name に格納してしまうことでしょうか?(ご存知だと思いますが、ファイル名は、複数選択できますね。私は、最初から複数選択していると思っていたので、そこに違いがありました。) Private Sub CommandButton2_Click()  Dim file_name As String   If ListBox1.ListCount = 0 Then     MsgBox "ファイル名が指定されていません", vbInformation   ElseIf ListBox1.ListCount = 1 Then     file_name = ListBox1.List(0)     MsgBox file_name   ElseIf ListBox1.ListCount > 1 And ListBox1.Text = "" Then     MsgBox "ファイル名をひとつ選択してください", vbInformation   End If End Sub >配列を作って一度ファイルの中身を格納後データを探してコピーしていますが、処理が遅くなることが見え見てです。 それと、配列を作って? テキストファイルですよね。テキストファイルを直接配列にしてしまえばよいと思います。もしかしたら、Excelを通していませんか?それは、遅いです。 ただ、行と列がどの程度の大きさになるのかが問題ですね。分からない場合は、キメウチで大きさを決める以外は、2次元配列にはできませんから、1次元配列にして、1行ずつ貼り付ける方法もあります。実際にやってみると、そんなにストレスは感じないで、済むはずです。 Application.ScreenUpDating =False 'セルに入れるコード Application.ScreenUpDating =True とすればよいです。 たとえば、こんなスタイル(他のアプリケーションで、"" の文字列の括り記号が入っているので、抜いています。"" がなければ、WorksheetFunction.Substitute はいりません。) Dim FileNo As Integer Dim FileName As String Dim TextLine As String Dim myArray As Variant Dim i As Long   FileNo = FreeFile()   If FileName <> "False" Then   Open FileName For Input As #FileNo   Do While Not EOF(FileNo)     Line Input #FileNo, TextLine     i = i + 1     If Len(TextLine) > 1 Then     TextLine = WorksheetFunction.Substitute(TextLine, """", "")      myArray = Split(TextLine, ",")     Cells(i, 1).Resize(, UBound(myArray) - LBound(myArray) + 1) = myArray     End If   Loop   End If Close #FileNo 結局、Excelの場合は、ここで、ADO を使うにしても、ADO自体を保持しているわけではないので、ワークシートを経由しているのと、あまり大して違わなくなってしまいます。

senho
質問者

お礼

Wendy02さん 丁寧な解説ありがとうございます。 自分でもなぜユーザーフォームに拘っていたのか、ユーザーフォームを 使わなくても、ファイル名が指定できれば処理できるので、作りを変えることにしました。 入力フィールドには、リストボックスで選択させることで対応できそうです。 参照したファイルの中には、4列・数行のデータしたないことがわかり それならば選択したファイルを、Workbookに読み込みVLOOKUPで十分 対応できることがわかりました。 Const 範囲 As String = "Sheet1!A1:D100" のような記述をしておくとファイルが変わっても応用が利くので 記述する行が減って、結果的に処理スピードも上がった気がします。 >Application.ScreenUpDating =False 'セルに入れるコード Application.ScreenUpDating =True とすればよいです。 これも追加したら体感的に早くなりました。 いろいろな選択肢があるわけですが、難しく作りすぎていたようです。 ご指摘を受けて冷静に処理を考えることができました。 まだ改造途中なため、クローズせずにおきたいと思います。 ひとまずお礼を先に申し上げておきたいので。ありがとうございました。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。 お忙しいところですから、あまり、かき回してしまってはいけないと思いつつも、思い出したことなのですが、ひとつだけ古いワザを書いておきます。決してお勧めではないのですが、時には、役に立ちます。以下の中から気に入ったものを、ユーザー定義型 Function にしておいて、それをループで使えば、かなり使えます。 これは、MS-DOS時代からの方法で、もともと、Excelのファイル構造が、シーケンシャルではなくて、たぶんランダムファイルのようになっているからだと思うのです。だから、Excelファイルは、直接、データベースファイルとしても使えるわけです。 『ファイルを開けないで、その値をとる方法』 もちろん、ADOなら、取得だけでなく、変更も可能なのですが、これは、それよりも原始的な取得するだけの方法です。 Sub DirectGetValues() Dim MyDir As String Dim MyFile As String Dim MySheet As String Dim MyStr As String Dim i As Integer Dim MyAddress As String Dim Ar(9, 0) As Variant '0-9 までの10個格納 ' '下の3つの変数は任意で実際のものに変更して下さい。 MyDir = Application.DefaultFilePath MyFile = "test.xls" MySheet = "Sheet1" ' 'あるセルの値。(ここではA1) '//R1C1 形式で書くこと // MyStr = "'" & MyDir & "\[" & MyFile & "]" & MySheet & "'!R1C1" MsgBox Application.ExecuteExcel4Macro(MyStr) ''Debug.Print MyStr ' 分からなくなったら、Debug.Print でみてください。 ' ' 'ある範囲の数値の合計。(ここではA2:A11) MyStr = "SUM('" & MyDir & "\[" & MyFile & "]" & MySheet & "'!R1C1:R10C1)" MsgBox Application.ExecuteExcel4Macro(MyStr) 'セルひとつずつから取得する方法 A1:A10 Application.ScreenUpdating = False For i = 1 To 10 MyStr = "'" & MyDir & "\[" & MyFile & "]" & MySheet & "'!R" & i & "C1" Cells(i, 1).Value = Application.ExecuteExcel4Macro(MyStr) Next i Application.ScreenUpdating = True '配列変数で取る方法 (速い) A1:A10 MyAddress = Range("A1:A10").Address(1, 1, xlR1C1) 'A1をR1C1 方式に転換する方法 MyStr = "'" & MyDir & "\[" & MyFile & "]" & MySheet & "'!" & MyAddress For i = 1 To 10 Ar(i - 1, 0) = Application.ExecuteExcel4Macro("INDEX(" & MyStr & ", " & i & ",)") Next i Cells(1, 2).Resize(10).Value = Ar() End Sub

senho
質問者

お礼

Wendy02さん No7のワザ、私にはとっても理解しやすかったです。 DOSで育ってきた私には、こういう考え方のほうがわかりやすいです。 今回は、No6の回答を元に作り直しました。最初の質問はユーザーフォームで ファイル名を選択させて、それを画面に表示させてからマクロを実行する ように作っていましたが、これは、マクロの中でFileOpenさせユーザーフォームの使用をやめました。 入力規制をかけてセルに必要事項を選択させるようにすれば、わざわざ ユーザーフォームを使うまでもなかったので、 ご指摘いただくまで、難しく作ろうとしていました。 処理自体の記述が減り、結果的に処理は早く終わるようになりました。 まだ改造の余地はありそうですが、ひとまずこの質問はこれにて終了とさせて いただきます。ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。Wendy02です。 もし、良かったら、こちらの時間の許す限りのことはします。 >ユーザーフォームを使うのは初めてに近く、分厚い本をがっつり見ても遅々として進みません 私がExcel VBAを習っていて、思ったことですが、 ・ひとつは、UserFormの詳しいマニュアルが存在しないこと。 ・もうひとつは、いまひとつ英語のプロパティがしっくりと覚えられないこと。+ヘルプが思うように出てこないことと、そのヘルプが良く分からないこと。 が挙げられるのではないでしょうか?VB6の学習書のようにフォームのコントロールは、懇切丁寧には、どの本も書かれていないので、分かったつもりでも、実践では、UserFormを作成中に行き詰まってしまうのです。4年目に初めて、初歩的な使い方を知るなんていうこともありました。 それと、前回、私が書いたコードのExcelではあまり区別がありませんが、 ListBox1.Value と、ListBox1.Text では、どちらかというと、[ListBox1.Text] がベターでした。ごめんなさい、ついうっかりしていました。(^^;基本は、Text プロパティでした。 >If IsNull(ListBox1.Text) Then Accessの使い方ですね。でも、Excelでは、IsNull のNull 値は、Variant 型の属性ですから、未格納の値でも、Text 値にはありません。ListBox1.Valueなら可能ですが、基本は Text 値なので、この初期値は、「""」(長さ0の文字列)です。 If ListBox1.Text ="" Then になります。(この違いって、ややこしいです(--;)) '参照ファイルの読み込み If ListBox1.Text ="" Then MsgBox "ファイル名が指定されていません", vbInformation Else file_name = ListBox1.Text End If ** , vbInformation こういうものを足して、ちょっとイメージを付けたします。 それから、 >振込銀行名と参照で開いたファイルの中身(日付、会員番号、金額)を該当会員番号にセットするというものです。 今は、やってみないとはっきりいえないのですが、もしかして、これ自体をファイルの中から探していませんか?言い換えると、手作業で探すのではないかと。 私の単なる想像でしかありませんが、 ファイルを探す -> ファイルを開ける -> その中のデータを探す ->コピー -> 元のファイルに貼り付け -> 開けたファイルを閉じる という一連の動作ではないでしょうか? もし、そうなら、一気にする方法があるような気がします。偉そうに言って、私自身が、どこまでできるかなっていう感じがしますが。どちらかというと、リレーショナル・データベースの使い方のようですね。

senho
質問者

補足

ありがとうございます。助けていただけると心強いです。^^ > vbInformation こういうものを足して、ちょっとイメージを付けたします。 雰囲気変わりますね。今後こういう気遣いを付加していきたいと思います。ところで、ファイル名が表示されている場合、ファイル名がクリックされている(青い帯がかかっている)状態の時には、拾えるのですが 表示されているだけだと、ファイル名が指定されていませんに行って しまいます。記述がたりないのでしょうか? Wendy02さんの想像通りの処理を行おうとしてます。 >リレーショナル・データベースの使い方のようですね。 余談ですが、 もともと、私自身ACCESSのクエリー操作が得意で、過去こういった物は ACCESSで作っているのですが、今回の機能はOfficePersonalが入って いる人の端末で、ACCESSでは作れないのです(泣)また、EXCEL操作も初級者なので作ったはいいが手離れしない状況です。 EXCELのユーザーフォームを利用して処理しようとしたのも そういった背景からで、あまりEXCEL操作に長けていなくても 処理ができるようにするために作っています。 なので、エラー処理は必ず盛り込む必要があって、逆にファイルを 開いて確認させずにできるだけ入力もさせずに、マクロを実行させたい という思惑です。ACCESSでできればすぐなんですが・・・ ファイルを開いたら、中身は全部無条件に拾います。 なので、配列を作って一度ファイルの中身を格納後データを探して コピーしていますが、処理が遅くなることが見え見てです。 よい方法があれば教えてください。 よろしくお願いします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 私は、Excelのユーザーフォームは苦手です。(^^; すごく、雑多というか、自分でいろんなコントロールは付けたしできるのですが、仕様書がありませんからね。だから、VB6のテキストを使わなくては良く分からない部分って、多いですね。 >ファイルの種類は、CSVかTXTのどちらかなのでOpenTxtはCSVの時に使用できませんよね? それは、使えます。ただ、それは、本来の目的ですよね。 今試したわけではないのですが、ヘルプには、 「DataType: の xlDelimited がデフォルトで、この引数を省略すると、ファイルを開いたときにデータの形式が自動的に決められます」と書いてあるのですが、 CSV の場合は、[区切り位置]の設定のデフォルト状態(もし、起動後の使った場合は、その設定)にしたがって、切り分けてしまいます。だから、もしも、特殊な切り分けの場合や、起動後にデフォルトの方法以外で使ってしまった場合は、CSV の拡張子の場合には、デリミタ(「,(コンマ)」 区切り)等の指定を、改めて設定してあげないといけなかったと思います。とりあえず、試してみてからにしてください。 Excelで開く目的でないなら、メモ帳を使ってしまっても良いのではありませんか? こんなものができます。(ただ、あまり大きなものはダメです。大きなものは、フリーのテキストエディタに換えたほうがよいです) たとえば、こんな風にしてみました。個人的には、これって意外に使えるなって思いました。私の好みを言ってももしょうがないけれども(^^;。。 'ダブルクリックをして、メモ帳で開く Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)   Shell "Notepad.exe " & ListBox1.Value, vbNormalNoFocus 'メモ帳で開く   'Workbooks.OpenText ListBox1.Value  'Excelで開く End Sub '内容を確認したら、右クリックで、Excelでオープン Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)  If Button = 2 Then '右クリックしたら   Workbooks.OpenText ListBox1.Value  End If End Sub

senho
質問者

補足

ご回答ありがとうございます。 私も、これまでいくつかマクロを作ってきましたがユーザーフォームを 使うのは初めてに近く、分厚い本をがっつり見ても遅々として進み ません(T_T) 今作成しているのは、参照したファイルの中にある日付で始まるレコー ドを別ファイルに格納していこうという機能です。 実際には、日付と会員番号と金額を格納するのですが、参照した ファイルは今のところ開かなくても大丈夫なので、この追記は後日に。 上記記述は、出来上がったあとで追加したい機能ですが・・・。 参照したファイル名はリストボックス上にファイル名が表示されていて 取込ボタンを押すと、別のコンボボックスで先に選択しておいた 振込銀行名と参照で開いたファイルの中身(日付、会員番号、金額)を 該当会員番号にセットするというものです。 基本的な質問だと思いますが、リストボックスにファイル名が表示 されていなければエラーにしたいのですが、表示されていてもエラー 処理されています。 どう記述したら解決しますか? '参照ファイルの読み込み If IsNull(ListBox1.Text) Then MsgBox ("ファイル名が指定されていません") Else file_name = ListBox1.Text End If

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >参照ボタンの横に空欄のテキストボックスを用意しておき 通常は、そういう場合は、リストボックスを使い For i = 1 To .SelectedItems.Count       ListBox1.AddItem .SelectedItems(i) Next i こんな感じにしますね。それで、リストボックスのプロパティのColumnWidths を、多めにとります。(例:400 pt) とすると、スクロールバーが現れますので、リストボックスの大きさは変えずに、コンパクトな場所に納めることができます。 ご質問の最初のコンボボックスのご説明は良く理解できませんが、このように作っておいて、リストボックスに、DoubleClick イベントで、開けるようにします。

senho
質問者

補足

Wendy02さん、的確なご回答ありがとうございます。 ファイル名の表示が長かったので、ご指摘のようにColumnWidthsを 設定してフォルダ名とファイル名を全て表示することができました。 ところで、私はユーザーフォームの作成自体あまりやったことが ないので、理解できていない状況なのでさらに質問させていただくと >リストボックスに、DoubleClick イベントで、開けるようにします。 この処理を追加するべく記述したのですがうまくいきません。 ファイルの種類は、CSVかTXTのどちらかなのでOpenTxtはCSVの時に使用 できませんよね? また、TXTファイルを指定した時、ダブルクリックで開く方法を 教えてください。 よろしくお願いします。

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.2

テキストボックスに表示するなら、以下のようにすればいいのではないでしょうか。 Private Sub 参照_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox1.Text = .SelectedItems(1) '←テキストボックスに表示する ' End With End Sub

senho
質問者

お礼

やりたいことができました! .SelectedItems(1)の左辺の記述がよくわからなかったので 実際やってみて、思ったとおりにできたのでこれからも いろいろ試してみたいと思いますが、今回取得したファイル名は サーバー上のファイルを参照するため、表示されるファイル名が 長く、テキストボックスではなくリストボックスで対応いたしました。 どうもありがとうございます。

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

こんにちは。 メッセージボックスにしたのですが、 こんな感じでしょうか。 Private Sub 参照_Click() Dim wMsg As String With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub wMsg = "参照ファイル(" & .SelectedItems(1) & ")を取込しますか?" If MsgBox(wMsg, vbQuestion + vbYesNo) = vbYes Then '取込処理 End If End With End Sub

senho
質問者

補足

メッセージボックスを使用せずに、表示させたいと考えています。 というのも、このユーザーフォームには、コンボボックスから選択した 区分によって、取込ファイルの格納先を変更するようにしたいので コンボボックスで選択した内容と、参照で表示したファイル名が 同一ユーザーフォーム上で表示され、その後取込ボタンで処理される ようにしたいと考えています。 例えば、参照ボタンの横に空欄のテキストボックスを用紙しておき 参照によって指定されたファイル名を表示する場合の表記は どのようになりますか?

関連するQ&A

  • VBAでユーザーフォーム上に参照したファイルを開きたいのですが…

    EXCEL2003 SP3での質問です。 ユーザーフォームをVBAで作成中です。 主な機能は、対象月をコンボBOXで選択させた上で、 データ元とインプット先のファイルをテキストBOXに参照し、 実行ボタンクリックでデータ元からインプット先の該当月シートに データをコピーするといった感じです。 (データ元の該当シート内データを全てコピー&ペースト) 取り込み以降の処理はVBAを使用せずに作成しようと考えています。 質問は、取込みたいファイルの参照後の「ファイルを開いてデータをコピーする」処理がうまくいかず、 どのようにしたらよいか教えて頂けますでしょうか。 現在、以下のように記述していますが、 CommandButton3_Click()の部分の処理が分からずファイルが開けません。ご教授ください。 Private Sub CommandButton1_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox1.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton2_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "テキスト", "*.csv;*.txt", 1 If .Show = 0 Then Exit Sub Me.TextBox2.Text = .SelectedItems(1) End With End Sub Private Sub CommandButton3_Click() Dim file_name As String If TextBox1.Text = "" Then MsgBox "ファイルが指定されていません", vbInformation ElseIf TextBox1.Text = "" Then file_name = TextBox1.Text = "" Shell "Workbooks.OpenText TextBox1.Value " End If End Sub Private Sub CommandButton4_Click() yesno = MsgBox("保存後、ファイルを閉じます。終了していいですか?", vbYesNo + vbQuestion, "Reportの終了") If yesno = vbYes Then ActiveWorkbook.Save ActiveWorkbook.Close Else End If End Sub

  • Access VBAについて教えて下さい。

    Access VBAについて教えて下さい。 <内容> 選択ボタンを押下するとファイル選択のダイアログ画面が表示されます。 そこから複数ファイルを選択してテキストボックスに選択したファイルを取得します。 実行ボタンを押下するとテキストボックスで取得したファイルを同じテーブルにインポートします。 ※テキストボックスの名前 = FileList <VBA> Private Sub 選択_Click() With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Title = "ファイル選択" .Filters.Add "すべてのファイル", "*.*" .Filters.Add "テキストファイル", "*.txt" .Filters.Add "TSVファイル", "*.tsv" .Filters.Add "EXCELファイル", "*.xls" .AllowMultiSelect = True .InitialFileName = CurrentProject.Path If .Show = -1 Then Me.FileList = .SelectedItems(1) 'ユーザーが [キャンセル] をクリックした場合 Else End If End With End Sub Private Sub 実行_Click() 'テーブル削除 On Error GoTo エラー Dim mySQL As String Dim strName As String Dim strmsg As String Set Db = CurrentDb strName = "テスト" strmsg = "" & strName & "テーブルを削除します。" mySQL = "DROP TABLE " & strName '「はい」ボタンを押下した場合 If MsgBox(strmsg, vbYesNo) = vbYes Then Db.Execute mySQL MsgBox strName & "テーブルを削除しました。", vbCritical MsgBox "インポートします。", vbInformation 'インポート開始 DoCmd.TransferSpreadsheet aclmport, acSpreadsheetTypeExcel8, "テスト", FileList, True MsgBox "インポート完了", vbInformation '「いいえ」ボタンを押下した場合 End If Db.Close: Set Db = Nothing Exit Sub 'テーブルが存在しなかった場合 エラー: MsgBox strName & "テーブルが存在しません。", vbExclamation MsgBox "インポートします。", vbInformation 'インポート開始 DoCmd.TransferSpreadsheet aclmport, acSpreadsheetTypeExcel8, "テスト", FileList, True MsgBox "インポート完了", vbInformation End Sub <困っていること> ファイルを複数選択することは、出来ますがテキストボックスには1ファイルしか取得出来ません。 そのため、インポートも1ファイルのみになってしまいます。 どのようにしたらテキストボックスに複数ファイル名を取得し、インポート出来るのでしょうか?

  • VBA コンボボックスのコード記述位置について

    初心者です。初歩的な質問でお恥ずかしいのですが、コンボボックス用のコードを 記述するには「Private Sub UserForm_Initialize()」の下に記述するしかないのでしょうか。 例えば、縦長のユーザーフォームに上からコンボボックス1、コマンドボタン、コンボボックス2を 配置した場合、コードの記述をコンボボックス1の処理、コマンドボタンの処理、コンボボックス2の処理と、順番通りに記述することは出来るのでしょうか? 現在はこのようにコードを記述しています。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "赤色" .AddItem "青色" .AddItem "黄色" End With With ComboBox2 .AddItem "緑色" .AddItem "黒色" .AddItem "紫色" End With End Sub Private Sub CommandButton1_Click() MsgBox "テスト" End Sub 本当であれば、下記のように順番通りに記述したいです。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "赤色" .AddItem "青色" .AddItem "黄色" End With End Sub Private Sub CommandButton1_Click() MsgBox "テスト" End Sub With ComboBox2 .AddItem "緑色" .AddItem "黒色" .AddItem "紫色" End With End Sub With ComboBox2の上に、必要なコードを記述すればできるのでしょうか。 ご教示下さい。

  • 複数のCSVファイルを読み込んで複数シートを1ブックとしたい

    始めまして。 VBA初心者です。 2枚のCSVファイルをダイアログで各々指定し、保存する2枚のシートを1ブックにまとめたいのですが、うまくいきません。 現状は以下のようなマクロですが、別々のシートとなります。 よろしくお願い致します。 Sub 選択されたPDPファイルを開いて読み込む() With Application.FileDialog(msoFileDialogOpen) .Title = "ファイルを選択して[OK]ボタンをクリックしてください" .AllowMultiSelect = False '複数選択不可 .Filters.Clear .Filters.Add "1枚目", "*.csv", 1 If .Show = -1 Then .Execute 'キャンセルでなければ開く End With With Application.FileDialog(msoFileDialogOpen) .Title = "2つめのファイルを選択して[OK]ボタンをクリックしてください" .AllowMultiSelect = False '複数選択不可 .Filters.Clear .Filters.Add "2枚目", "*.csv", 1 If .Show = -1 Then .Execute 'キャンセルでなければ開く End With End Sub

  • VBA コンボボックスの条件分岐

    コンボボックスの条件分岐のコードが間違っているみたいで 調べても分からなかったので質問します。 やりたいこと 『マスタ』という名前のシート内のセルを参照し マスタシートには C2セル『A』C3セル『B』C4セル『C』と それぞれアルファベットがあります。 そこでコンボボックスを使用し コンボボックス22にC2~C4セルを選択できるようにし 例えばC2セルを選択したら コンボボックス21の参照範囲をマスタシート内の D2~D13セルを選択できるようにし C3セルを選択したら コンボボックス21の参照範囲をマスタシート内の E2~E13セルを選択できるようにしたいのです。 すいませんがコードを記載して頂けますと 助かります。 Private Sub UserForm_Activate() '----------------------- With ComboBox22 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!C2:C4" End With '↑こうすればコンボボックス22のマスタシートのC2からC4まで値を選択できるようになります。 '------------------------わかりやすく区切っています。 '--------------------------------------- If UserForm1.ComboBox22 = "A" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" End With End If '↑コンボボックス22の値が(C2セルの値がAなら)コンボボックス21をマスタシートのD2からD13までを選択できるようにしたい If UserForm1.ComboBox22 = "B" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End With End If '↑コンボボックス22の値が(C3セルの値がBなら)コンボボックス21をマスタシートのE2からE13までを選択できるようにしたい '----------------------------------------区切っています。 End Sub

  • Access csvファイルの取り込み

    Access2021 2箇所の保存先の違う所からcsvファイルの取り込みについて伺います。 csv取り込みボタンは、2つ用意しています。 1つ目のボタンに、コード記述して動作確認は正常に動作して他のボタンも正常に動作。 2つ目にのボタンに、csvの格納パス名のみ変更後コード記述して動作確認したら全てのボタンが反応しなくなりました。 動作としては、削除クエリでテーブルのデータを削除してから、指定したフォルダからcsvファイルを選択して取り込ます。 同じテーブルを使用して、格納先の違うcsvファイルを使用する操作になります。 コードは、以下の通りです。 ①ボタン1 Private Sub コマンド61_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名①" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ②ボタン2 Private Sub コマンド62_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名②" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ご教授の程、宜しくお願い致します。

  • VBAでオプションボタン変更によって・・・

    エクセルVBAのユーザーフォーム内にあるコンボボックス3つを選択することによりデータ入力を行っています。 この度選択肢を増やすことになり、オプションボタンを2つ追加しようと思っています。 オプションボタンはどちらかを決定することで、コンボボックスの選択内容を変更する予定です。 コンボボックスは大中小分類としており、シート2から抽出したものをシート1に落としている現状をオプションボタン新設により、ボタン1は従来通りシート2から、ボタン2選択時はシート3にあるリストからコンボボックスへ繁栄させようとしたいのですが、方法が分かりません。 どなたか、教えていただけると助かります。 よろしくお願いします。 現在のコードを下記に記します。 Private Sub UserForm_Activate() With UserForm3 .OptionButton1 = True *この段階でボタン2を選択時は、シート3にあるリストよりコンボボックスの内容を抽出したい。 以下中小分類も同様としたい。 .ComboBox1.RowSource = "シート2!A3:A15" .ComboBox1.SetFocus End With End Sub Private Sub ComboBox1_Change() Dim myLlist As String myLlist = ComboBox1 With UserForm3 .ComboBox2.Text = "" .ComboBox3.Text = "" Select Case myLlist Case "大1" .ComboBox2.RowSource = "シート2!B21:B26" Case "大2" .ComboBox2.RowSource = "シート2!B27:B28" End Select End With End Sub Private Sub ComboBox2_Change() Dim myMlist As String myMlist = ComboBox2 With UserForm3 .ComboBox3.Text = "" Select Case myMlist Case "中1" .ComboBox3.RowSource = "シート2!C101:C111" Case "中2" .ComboBox3.RowSource = "シート2!C121:C124" End Select End With End Sub Private Sub OKボタン_Click() With UserForm3 ActiveSheet.Unprotect 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm3.ComboBox1.Value Cells(行, 列 + 1) = UserForm3.ComboBox2.Value Cells(行, 列 + 2) = UserForm3.ComboBox3.Value ActiveSheet.Protect End With End Sub

  • Excel VBAでコンボボックスで選択

    コンボボックスで選択したいと思っていますがうまくいきません。 教えてください。 Private Sub userform_initialize()  With ComboBox2   .Font.Size = 12   .AddItem "A"   .AddItem "B"   .AddItem "C"  End With If ComboBox2 = "A" Then  With ComboBox3   .Font.Size = 12  .AddItem "a-1"  .AddItem "a-2"  End With ElseIf ComboBox2 = "B" Then With ComboBox3   .Font.Size = 12  .AddItem "b-1" .AddItem "b-2" End With Else: ComboBox2 = "C" With ComboBox3 .Font.Size = 12 .AddItem "c-1" .AddItem "c-2" End With End If End Sub コンボボックス2で"A"を選んだら、コンボボックス3には"a-1とa-2"の選択したい のですが、"c-1,c-2"しかでません。よろしくお願いします。

  • 参照ボタン

    「ファイル参照」を作成したとき、テキストボックスと参照ボタンが表示され、参照ボタンをクリックするとファイル選択ダイアログが表示されて選択したファイル名がテキストボックスに表示されますが、あらかじめテキストボックスにファイル名が表示されるような処理はHTMLにあるのでしょうか?

    • ベストアンサー
    • HTML
  • EXCEL VBAで、日付の後に曜日を追加する方法について

    EXCEL VBAの日付の機能のことで教えていただきたいことがあります。    A列 1行:2008/02/01 2行:2008/02/03 3行:2008/02/04  ・  ・ コントロールツールボックスでコンボボックスをシートに挿入 Private Sub Workbook_Open() With ComboBox1 .AddItem Range("A1") .AddItem Range("A2") .AddItem Range("A3")     ・     ・ End With End Sub コンボボックスには「2008/02/01」等と表示されたリストが表示されると思いますが、 選択した後の値を「2008/02/01(月)」というように、 日付の後に曜日を追加して表示させるにはどのような処理をしたらよろしいでしょうか。 Private Sub ComboBox2_Change() ComboBox2 = ? End Sub というようなやり方かとは思うのですが、具体的なコードがさっぱり思い浮かびません。 どうぞよろしくお願いいたします。

専門家に質問してみよう