• 締切済み

Access VBA インポート シート指定

AccessのVBA を用いて、ExcelからAccessへデータを インポートする際、ダイアログボックスを表示させて Excelのファイルを選択させるようにしています。 これをシート名まで指定させる事は可能でしょうか? ◆シートは枚数が固定されず、都度かわります。 ◆インポートしたいシート数も都度かわります。 ◆1sheet = 1 テーブルにしたいです。 ◆1度の動作で、1sheetのインポートでも、複数でもかまいません。 ◆できれば、ダイアログでファイルを選択した流れで シートまで選択される方法が望ましいです。 ◆Accessのテーブル名もテキストボックスで任意なものが 付けられるようにしたいです。 お知恵をお貸し下さい、何卒よろしくお願いいたします。

みんなの回答

  • tate_san
  • ベストアンサー率33% (1/3)
回答No.2

WIN 7 Home Premium Access2010の環境でテストをしました。 シート名格納用のテーブル“T_選択シート名”(シート名・テキスト型、選択・Yes/No型、テーブル名・テキスト型)、ファイル選択用のフォーム“F_ファイル選択”(コマンドボタンを2つ<選択、インポート>、テキストボックスを1つ<ファイル名>、サブフォームを1つ<F_選択シート名 T_選択シート名から生成>)を作成 Microsoft Office 14.0 Object Library及びMicrosoft ActiveX Data Objects 6.0の参照設定を行う。 1.フォーム上のコマンドボタン“ファイル選択”をクリック 2.ファイル選択ダイアログボックスを表示 3.処理するエクセルふぁいえうを選択 4.DAOで選択したエクセルファイルのシート名を取得 → Microsoft Access Clubの記事を参考 5.サブフォームにシート名を表示 6.処理するシートをサブフォーム城から選択 7.フォーム上のコマンドボタン“テーブルへインポート”をクリック 8.選択したシートをインポート ※フォームの画像を添付しましたが、見ずらかったらすみません。 Private Sub 選択_Click() Dim FDB As FileDialog Set FDB = Application.FileDialog(msoFileDialogFilePicker) Dim SFL As Variant Dim FileSelect As Variant With FDB .Title = "Excelファイルの選択" .Filters.Add "Excelファイル", "*.xls; *.xlsx; *.xlsm", 1 .Filters.Add "すべてのファイル", "*.*" .AllowMultiSelect = False .InitialFileName = CurrentProject.Path If .Show = -1 Then For Each SFL In .SelectedItems FileSelect = SFL Next End If End With Me!L_ファイル名.Visible = True: Me!ファイル名.Visible = True Me!ファイル名 = FileSelect DoCmd.SetWarnings False DoCmd.RunSQL "DELETE T_選択シート名.* FROM T_選択シート名;" DoCmd.SetWarnings True Dim RS As New ADODB.Recordset Dim CN As New ADODB.Connection Set CN = CurrentProject.Connection RS.Open "T_選択シート名", CN, adOpenKeyset, adLockOptimistic Dim Db As DAO.Database Dim Tbl As DAO.TableDef Dim xlsFile As String xlsFile = FileSelect Set Db = OpenDatabase(xlsFile, True, True, "Excel 12.0;") For Each Tbl In Db.TableDefs If Right$(Tbl.Name, 1) = "$" Or Right$(Tbl.Name, 2) = "$'" Then 'シート名の最後は必ず$が付きます RS.AddNew RS.Fields(0).Value = Left(Tbl.Name, (Len(Tbl.Name) - 1)) RS.Update End If Next Tbl RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing Db.Close Set Db = Nothing Set FDB = Nothing Me!F_選択シート名.Visible = True Me!F_選択シート名.Requery Me!インポート.Visible = True End Sub Private Sub インポート_Click() Dim I As Integer Dim RS As New ADODB.Recordset Dim CN As New ADODB.Connection Set CN = CurrentProject.Connection RS.Open "T_選択シート名", CN, adOpenKeyset, adLockOptimistic For I = 1 To RS.RecordCount If RS.Fields(1).Value = True Then DoCmd.TransferSpreadsheet , acSpreadsheetTypeExcel12, RS.Fields(2).Value, Me!ファイル名, True, RS.Fields(0).Value & "!" End If RS.MoveNext Next I RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub

参考URL:
http://www.accessclub.jp/bbs5/0005/vba1231.html
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

数日前に同様のエクセルからアクセスへVBAでインポートする質問の回答のとき書いたのだが、 oCmd.TransferSpreadsheet acImport を使う限りでは,シートは個別に指定しなければならず、1シート1回ずつの実行になると思う。 出来ることは、これをVBAで繰り回すプログラムを作ることだけではないかな。 (エクセルVBAでシートをよみ、ADOなどでアクセスのテーブルにレコードを書き込んでいく方法はあるが、本回答はそれは目指してない) ・ファイル指定 >「ダイアログボックスを表示させてExcelのファイル(X)を選択させるようにしています、であればその点は解決済みと思うので ・シート指定 あとはシート名を何かに表示させて、シートを1つ選択させて(Y)、両者からDocmdの文字列にX,Yを組み込めば仕舞いでしょう。 ーー 例 全般的に見て主要なテーマは DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "01化", "01化.xls", True, "Sheet1!A1:D3" ーー 2つのことがしたいのだと思う (1)(アクセスにインポートしたい)エクセルファイル(ブック)を1つ指定 沢山のブックを一遍に指定していくようなのは、さらに難しくなると思うので除外 (2)そのファイルの中のシートを1つ指定 こちらは複数同時指定は出来ない模様。 これらを出来れば対話形式(ダイアロウグ)で選択したいということかな。 ーーー しかし、結構下記は難物であるようだ。 (1)アクセスではファイル選択のダイアロウグは(APIを使わないと出来ない、APIの使用はVBAを外れる。 WEBには例が載っているが)使えないようだ。 質問者は出来ているような口ぶりだが、この部分はどのようにしたのかな。 (2)シート選択のダイアロウグが(これはもちろんエクセルVBAの世界でだが)が良いものが無い。 これもWEBに回答として上がっている例があるが、難しいので使用を避けた。PopUpなどの例があるが、簡単ではない。 それでInputBoxのコメントにシート名をだし、その中の番号を入力するで逃げた。 それで、エクセルとアクセスを行き来する、すっきりしないものになっているが一応私の試行例を挙げておく。 改良してください。 ーーー Access(エクセルではない)のモジュールに Sub Sample4() Dim sn(30) Dim ws As Object Dim xlsFileName As String Set xls = CreateObject("Excel.Application") xlsFileName = xls.GetOpenFilename("Microsoft Excelブック,*.xls") If xlsFileName <> "False" Then fn = Split(xlsFileName, "\") fns = fn(UBound(fn)) 'ファイル名の部分を摘出 MsgBox fns Else MsgBox "キャンセルされました" End If '-- Set bk = xls.workbooks.Open(xlsFileName) '----シート選択 i = 1 For Each ws In bk.Worksheets sn(i) = ws.name s = s & i & " " & ws.name & vbCr i = i + 1 Next X = InputBox(s, "シート選択 番号指定") MsgBox sn(X) & " を選択しました" sns = sn(X) '-- bk.Close xls.Quit Set xls = Nothing '-----エクセルは脱出してアクセスで実行 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "01化", fns, True, sns & "!A1:D4" End Sub この例では1シートのコードなので、まず1例でテストして出来るかどうか納得してください。 その後、「多数または同一のブック」の他シートについて連続してやる場合は、上記のコード全体をループの中において、 DoCmd.のテーブル名の01化  に当たるアクセスの(エクセルの1シートに対応する)テーブル名を都度使用者から、変数に受け取るようなコードに変えて、(最低ではInputBoxで聞いて、応答を受ける)、その変数で、テーブル名をセットするに変えてください。 各シートのデータ範囲は最大の範囲を指定して、うまく行かないかやってみてください。(毎回範囲を指定するとなるとさらに複雑になる。エクセル側で、Application.Inputboxのタイプ8利用など。)

関連するQ&A

  • Accessにエクセルからデータをインポートしたい(VBA)

    Access(2000)のVBAでExcel(2000)からデータをインポートしたいと思います。 詳細は以下の通りです。 フォームでコマンドボタンをクリック時にダイアログボックスが開き、ファイルを指定し、該当のシート(シート名はどのファイルも固定)のデータをアクセスのテーブルにインポートしたい。 どうしたらできるのかここ数日悩んでいます。 よい方法がありましたら教えてください。

  • 【AccessVBA】フォルダを指定してインポート

    私は現在、Accessでフォルダ内のExcelファイルを一括でインポートし集計するというツールを作成しております。 そこで質問ですが、フォルダ指定ダイアログを表示し、ダイアログで指定したフォルダ(中はxls,xlsx,xltmなど)をテーブル上にインポートするようなVBAはありますでしょうか? まとめます。 ・フォルダを選択するダイアログを表示したい ・一つのフォルダの中に、幾つものエクセルファイルが存在する ・ファイル名などはバラバラです ・シート単位でインポートしたいです ・インポートするシートを選択できるようにしたいです ・テーブルのカラムは決まっています 以上です。 どうか皆様のアドバイスよろしくお願い致します。

  • ACCESS VBA マクロ  Excelのデータをインポートする(複数シート)

    ACCESSのVBAでEXCELのシートにあるデータをインポートしたいです。シートは複数あり、シート数は作業毎に一定ではありません。データの数もシート毎に違います。(項目(column数)は全部同じです) 手作業でインポートをすると、どのシートのデータをインポートするかウイザードで選択しますが、シート数が多いので一度に同じテーブルにインポートをするVBAを組みたいのです。(データ数が多いのでエクセルで一つのシートにまとめる事が出来ません。) シート数がその都度違うので変数を使ったりVBAでインポートするのかな?と思うのですが。。。 インポートするベースのテーブルは先に作ってあり、データをインポートする際にそのテーブルに追加する形にしたいと思っています。 excelのVBAは初心者ですがAccessでのVBAの経験がありません。 ACCESSでのマクロ、VBAを良くご存知の方がいらっしゃったら是非教えてください。どうぞよろしくお願いいたします。

  • access vba インポートについて

    別のところで質問したのですが、回答が得られなかったので こちらで質問しまする。 昨日、accessをさわリはじめた、おっさん初心者です。 お願い:エクセルのデータをアクセスにインポートしたいです。      1つのエクセルファイルに複数(30枚)シートがあり、      それぞれのシート名で、アクセスのテーブルが複数作成できれば良いです。      アクセスのVBAにどんなコードを書けば良いのでしょうか。 1つのシートの取り込みは、 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, ”インポート先テーブル名", "ファイル名", True, "シート名" & "!" (全くわかってませんが、)これでできましたが、この辺がおっさんの限界でした。 色々web見たのですが、難しい・・・とりあえず、やさしく教えてください。 (1)フィールド名ごとインポートする方法 (2)すでに存在するテーブルにデータを継ぎ足す方法 テーブル”A”には  日付     獲物    調理    感想   1月1日    きつね   なべ    にがい  1月2日    もぐら   からあげ  まずい 1月3日    ぱんだ   さしみ   あまい           ↑   ↑   ↑   ↑  ↑ シート ”A”から 1月4日    たぬき   なべ    ばかうま 1月5日    らっこ   ひもの    うまい を追加 この二つができるとうれしいです。 アクセスは2000です。 エクセルは2000です。 ウィンドウズはXPです。 エクセルは初級程度できます・・・。 基本を理解していなくてもわかる感じで助けてパソコン大先生!!

  • Excelマクロ/ファイル名を指定してインポート

    テキストファイルからExcelへインポートする作業を自動化させたいのですが。 毎回インポート元のファイル名(格納しているフォルダは同じです)が異なるので、マクロ記録ではうまく作成できません。VBAでないと無理でしょうか? できればファイル名をその都度入力するようなダイアログボックスが表示されれば理想的です。VBA初心者なので教えてください。

  • ACCESS ワークシート インポートウィザード に行かない

    ACCESSのインポートを試みているのですが、「ワークシート ウィザード」の画面(ダイヤログボックス)が出ないのです。  ExcelデータをACCESS2000にインポートを試みているのです。 (1)[ファイル」メニュー → 「外部データの取り込み」→「インポート」 (2)「インポート」ダイヤログボックスから、Excelのファイルとファイルの種類[Microsoft Excel]を選択し、[インポート(M)」をクリックすると、「ワークシート ウィザード」の画面(ダイヤログボックス)が出るはずなのに出ないのです。 何か設定を変更したのではないかと考えていますがわかりません。 どなたか教えてください。

  • アクセス2003・VBA

    アクセス2003を使っています。 アクセスのVBAを使って下記のやり方を教えて下さい。 (1)ファイル名を指定して、エクセルファイルを開く。 (VBA構文上でファイル名を入力し、固定するのではなく、そのVBAを実行すると、ファイルをダイアログで選択する方法です。) (2)その開いたファイルで2行目からデータが入っている行までをコピーし、そのVBAを実行しているアクセスファイルの特定のテーブルに貼り付ける。 上記の方法がお分かりの方、是非教えて下さい。 よろしくお願いします。

  • 任意Excel,TxtファイルをAccessへ取込

    ダイアログボックスにて取得したEXCEL2003ファイルおよびTextのインポート方法を教えていただけないでしょうか?ダイアログボックスからファイル名を取得するところ(テキストボックスにファイル名を代入するところまで)は、AccessClubのサンプルファイルで何とか紐解けましたが、この選択されたExcelファイルをAccessのテーブルとして(テーブル名=Excelファイル名)ファイルインポートするところがなかなか作れません。調べてもなかなか情報みつからずです。いまは、ファイル名とフォルダ場所を固定させることによって、マクロの”ワークシート変換”にて取り込んでおります(添付画像参照ください)。どうかアドバイスのほどよろしくお願い申し上げます。なお、Access2003です。

  • ACCESS VBAでexcelの複数シートをインポートしたい。

    ACCESS VBAでexcelの複数シートをインポートできますか。 TransferSpreadsheetでシートを指定できるのでしょうか。 宜しくお願いします。

  • Excel→Access VBAによるインポート

    1つのExcelファイルの複数のデータシートをAccess2000にインポートしたい。 【説明】 data.xlsという名前のExcel2000で作成したファイルがあり、その中に同じ書式(列)を 持ったSheetが20枚ほどあります。 それらのデータをAccess2000にインポートしたいのですが、 1.作業は毎月発生する。 2.ほかのユーザも出来るようにする。 などの理由から、マクロかVBAを使って自動化できればと考えています。 ぽちっとボタンを押すと、data.xlsのすべてのシートからデータをインポートし、 それぞれのSheet名がついたテーブルに格納されるというのが理想です。 フィールド名は固定ですので、あらかじめテーブルを作っておくことは出来ます。 Excelの各シートの上部数行は見出しやら説明文が書いてありますので、 インポートの際にその部分の行(5行分)を削除することが必要です。 当方VBAの知識はほぼ皆無ですので、やんわりご教示頂ければ幸いです。 よろしくお願いいたします。 (次回ネットに入るのは15日以降です)

専門家に質問してみよう