AccessのVBA を用いて、ExcelからAccessへデータを
インポートする際、ダイアログボックスを表示させて
Excelのファイルを選択させるようにしています。
これをシート名まで指定させる事は可能でしょうか?
◆シートは枚数が固定されず、都度かわります。
◆インポートしたいシート数も都度かわります。
◆1sheet = 1 テーブルにしたいです。
◆1度の動作で、1sheetのインポートでも、複数でもかまいません。
◆できれば、ダイアログでファイルを選択した流れで
シートまで選択される方法が望ましいです。
◆Accessのテーブル名もテキストボックスで任意なものが
付けられるようにしたいです。
お知恵をお貸し下さい、何卒よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
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
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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
【お題】引っかけ問題(締め切り10月27日(日)23時)
【大喜利】 「日本で一番高い山は富士山……ですが!」から始まった、それは当てられるわけ無いだろ!と思ったクイズの問題
-
自分のセンスや笑いの好みに影響を受けた作品を教えて
子どもの頃に読んだ漫画などが その後の笑いの好みや自分自身のユーモアのセンスに影響することがあると思いますが、 「この作品に影響受けてるな~!」というものがあれば教えてください。
-
あなたの習慣について教えてください!!
あなたが習慣だと思って実践しているものを共有してくださいませんか? 筋肉トレーニングでも朝シャワーでも、あなたが習慣だなと思えば何でも構いません
-
accessへエクセルの複数のシートのインポートの仕方
Access(アクセス)
-
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
Accessで、1つの項目に複数の置換えを1度でするには?
Access(アクセス)
-
-
4
accessでクエリをExcelにエクスポートする時にファイル名に日付を追加したい
Access(アクセス)
-
5
AccessからExcelにエクスポートする時に常に上書きしたい
Excel(エクセル)
-
6
アクセスからエクセルのシートを追加して、名前をつける方法
Excel(エクセル)
-
7
AccessVBAで作成したExcelファイルを削除する方法は?
Visual Basic(VBA)
-
8
Access→Excelへエクスポートすると日付の表示形式が変化する
Excel(エクセル)
-
9
Access VBAからExcelシートの削除
Excel(エクセル)
-
10
アクセスクエリ(複数)→マクロ→エクセル出力(ワークシート別)
その他(パソコン・スマホ・電化製品)
-
11
エクセルの指定したシートにエクスポート
その他(データベース)
-
12
AccessのテーブルデータをExcelの特定のワークシート名にエクスポートすることは可能ですか
Excel(エクセル)
-
13
ACCESSのVBAにてExcelのシートをコピーしたい
その他(データベース)
-
14
ACCESS側からEXCELの書式を設定するには?
Visual Basic(VBA)
-
15
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
16
ファイル名にドットを使ったファイルのインポート(ACCESSマクロ)
Visual Basic(VBA)
-
17
テキストボックスの値をテーブルに追加
その他(データベース)
-
18
Accessを開くと「排他モードじゃないので変更しても保存できない」との旨の表示が出てしまう。
Access(アクセス)
-
19
ACCESS VBAでのインポート
Access(アクセス)
-
20
アクセスでcsvに出力した際、頭の0が消えてしまいます
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルでブック内の倍率がバ...
-
【ExcelVBA】マクロの入ったシ...
-
特定のシートのみ再計算させな...
-
EXCELの図形(テキストボックス)...
-
エクセルで複数のシートに画像...
-
ハイパーリンクでジャンプした...
-
エクセルのシート連番の振り直し
-
エクセルのシー名を二段表示に...
-
ワークシートそのものの色を変...
-
Excelでマクロ設定したが反映さ...
-
Wordで差し込み印刷時に表示す...
-
エクセル、別のシートの表をポ...
-
EXCELで存在しないシート...
-
エクセル、特定のシートにパス...
-
PowerQueryで行数の指定はでき...
-
エクセルの複数シートでのリン...
-
EXCELの「シートの見出し」のフ...
-
別シートの文字列があったら現...
-
vba Listviewでのチェックボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルでブック内の倍率がバ...
-
ハイパーリンクでジャンプした...
-
特定のシートのみ再計算させな...
-
エクセルで複数のシートに画像...
-
【ExcelVBA】マクロの入ったシ...
-
EXCELの図形(テキストボックス)...
-
エクセルのシー名を二段表示に...
-
エクセルのシート連番の振り直し
-
ワークシートそのものの色を変...
-
EXCELの「シートの見出し」のフ...
-
Accessのテーブルを既存のExcel...
-
Wordで差し込み印刷時に表示す...
-
エクセル、特定のシートにパス...
-
EXCELで存在しないシート...
-
エクセルの2つのシートを並び...
-
アクセスからエクセルのシート...
-
指定したシート名以外を非表示...
-
エクセル、別のシートの表をポ...
-
エクセルで誤ってF11キーを押す...
おすすめ情報