Access VBAで新しいシートを作成する方法

このQ&Aのポイント
  • Access VBAを使用してExcelファイルを編集するプログラムを作成しています。このプログラムでは、新しいシートを作成する必要があります。
  • Excelファイルを開き、新しいシートを作成するためには、Access VBAで次のコードを使用します。
  • Dim WsObj As Object Set WsObj = WBObj.Sheets.Add(, WBObj.Sheets(1))
回答を見る
  • ベストアンサー

Access VBA 新しいシート作成

Access VBAにてExcelファイルを編集するプログラムを作成しています。 Dim AppObj As Object 'Excel.Applicationオブジェクトの宣言 Dim WBObj As Object 'Excel.Workbookオブジェクトの宣言 Dim WsObj As Object 'Excel.WorkSheetオブジェクトの宣言 '実行時バインディング Set AppObj = CreateObject("Excel.Application") '編集を実施するワークブックを開く 'PathにはExcelファイルのフルパス、ExfにExcelファイル名が格納されています。 Set WBObj = AppObj.WorkBooks.Open(Path & Exf) 'Excelアプリケーションを表示する AppObj.Visible = True ※各Excelファイルはシートが1つだけ存在します。 この処理の直後に『数値』という名称の新しいシートを左から2番目に作成したいのですが、どのように記述すればよろしいでしょうか?

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

#1です。回答者の補足について、すみません。 下記でやってみてください。 私のテスト例と質問者の場合と異なるための修正は、前回答と同じです。 Sub test01() Dim AppObj As Object 'Excel.Applicationオブジェクトの宣言 Dim WBObj As Object 'Excel.Workbookオブジェクトの宣言 Dim WsObj As Object 'Excel.WorkSheetオブジェクトの宣言 Dim ws1 As Object '実行時バインディング Set AppObj = CreateObject("Excel.Application") '編集を実施するワークブックを開く 'PathにはExcelファイルのフルパス、ExfにExcelファイル名が格納されています。 PathExf = "C:\Users\XX\Documents\住所録例.xlsx" Set WBObj = AppObj.WorkBooks.Open(PathExf) 'Excelアプリケーションを表示する AppObj.Visible = True '---- Set sh1 = AppObj.worksheets(1) MsgBox sh1.Name '確認用 Set sh2 = AppObj.Sheets.Add sh2.Name = "abc" MsgBox sh2.Name '確認用 sh2.Move After:=sh1 End Sub テストは前回も今回もやっていて、結果を見届けています。 オフィスのファミリーソフト(エクセル、ワード、アクセスほか)で、他の種類のオフィスVBAコード(アクセスでエクセルVBAなど)を書くことの難しさがあります。 この点、小生は、甘かったのかも知れない。 (エクセルVBA内でシートを増やし、そのシートtabの位置を定めるコードは難しくありませんし、経験済みです。) 定数の、xl..などがそのままアクセスで使えるか?は有名ですが、他にも考慮すべき点があるようです.小生は十分理解が足らないのかもしれません。 この点、余りWEBにも記事が少ないようですが、 https://www.sanei-print.co.jp/blog/2017/01/24/184 Excel VBAでWordをコントロール などで、objWord.がしつこく被せられているのが、このことを示しているのでしょう。Objectを捉えたら、あとはエクセルVBAと同じコードが通用するようです。

Yoshikun0928
質問者

お礼

年末のお忙しい中ご回答いただきまして誠にありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

修正後 Sub test01() Dim AppObj As Object 'Excel.Applicationオブジェクトの宣言 Dim WBObj As Object 'Excel.Workbookオブジェクトの宣言 Dim WsObj As Object 'Excel.WorkSheetオブジェクトの宣言 Dim ws1 As Object '実行時バインディング Set AppObj = CreateObject("Excel.Application") '編集を実施するワークブックを開く 'PathにはExcelファイルのフルパス、ExfにExcelファイル名が格納されています。 PathExf = "C:\Users\XXX\Documents\住所録例.xlsx" Set WBObj = AppObj.WorkBooks.Open(PathExf) 'Excelアプリケーションを表示する AppObj.Visible = True '---- 'Set ws1 = AppObj.worksheets.Add.Name("ebc") 'NO ' AppObj.Sheets.Add(After:=AppObj.wb.obj.workSheets(1)).Name = "abc" 'NO AppObj.Sheets.Add.Name = "abc" 'OK AppObj.activesheet.Move After:=WBObj.worksheets(1) 'OK End Sub 後半(最後あたり)の2行を追加してやってみてください。 標準モジュールにコードを置くこと。 PathExf = "C:\Users\XXX\Documents\住所録例.xlsx"とOpen(PathExf)の部分は、(私のテスト例なので)質問の通りのもとへ戻すこと。 同名のブックはエクセルで開いてないこと。 エクセルはAccessにとっては、オブジェクト的に、他世界のことなので 普通に、エクセルで、エクセルVBAのコードを使うときと違った点があることを注意すること。 恥ずかしながら、'NOと書いて(参考までに)残した行は、「失敗の記」です。

Yoshikun0928
質問者

補足

回答いただきまして誠にありがとうございます。 回答いただいたコードを実行してみたところ、先頭に新しいシートが作成されてしまいました。 先頭から2番目に作成しようとした場合はどうすればよろしいでしょうか?

関連するQ&A

  • VBA セルにドロップダウンリスト 作成

    Access VBAについてお尋ねいたします。 Access VBA にてExcelファイルを操作するプログラムを作成しています。 Excelの指定した範囲のセルにドロップダウンリストを作成しようとしてコードを入力したらエラーが発生しました。 エラー内容:実行時エラー'1004'アプリケーション定義かオブジェクト定義エラーです エラーとなった処理コード Dim Exf as string Dim AppObj As Object 'Excel.Applicationオブジェクトの宣言 Dim WBObj As Object 'Excel.Workbookオブジェクトの宣言 Dim WsObj As Object 'Excel.WorkSheetオブジェクトの宣言 '実行時バインディング Set AppObj = CreateObject("Excel.Application") '編集を実施するワークブックを開く Set WBObj = AppObj.WorkBooks.Open(Path & Exf) '編集を実施するワークシートを設定する Set WsObj = WBObj.Worksheets(1) 'Excelアプリケーションを表示する AppObj.Visible = True col = 5:Count(i) = 15 '2行目からデータが存在する最後の行までドロップダウンリストを作成する With WsObj.Range(WsObj.cells(2, Col), WsObj.cells(Count(i) + 1, Col)).Validation .Add Type:=xlValidateList, _ AlertStyle:=xlValidAlertStop, _ Formula1:=Join(Li, ",") End With 処理の解説 1:Accessと同じファイルパス内のExcelファイルを開く 2:先頭のシートにて処理を実行する 3:E列の2行目からデータがある最後の行までをドロップダウンリスト化する 4:ドロップダウンリストにするデータは各Excelファイルの先頭から2番目のシートのA列にデータがあり、Liという配列に格納してあります。 ※A列のデータの範囲【行数】が処理するたびに異なるため、Liという配列を使用し、配列の全データをドロップダウンリスト化するという方法を採用いたしました。 エラーの修正方法がお分かりの方がいらっしゃいましたら回答のほどよろしくお願いいたします。

  • ADOを使用してExcelデータをAccess取込む際のExcelシートの選択について

    表記のとおりADOを使用してExcelデータをAccess取込むのですが、Sheet1のデータを読込んだ後、引続きSheet2のデータを読込む様にVBAコードを書いたつもりですが、Sheet1をアクティブにした状態でExcelデータを保存していたらSheet1のデータを重複して取込み、Sheet2をアクティブにした状態でExcelデータを保存していたらSheet2のデータを重複して取込んでしまいます。どこをどうすればSheet1のデータを読込んだ後、引続きSheet2のデータを読込む様に出来るのでしょうか? ====== VBAコードの抜粋 =========   Dim xlApp As Object       ' Excelのアプリケーション定義   Dim xlBook As Object      ' ExcelのワークブックのフォルダPath+ファイル名を定義   Dim xlSheet As Object      ' Excelの参照するシート名を定義   Dim SheetName As String     ' シート名を代入   Dim SheetCount As Byte     ' シートの選択 For SheetCount = 1 To 2       ' 1回目のループでSheet1から2回目のループでSheet2からデータを取り込む If SheetCount = 1 Then SheetName = "Sheet1" If SheetCount = 2 Then SheetName = "Sheet2" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("ファイルPath+ファイル名") Set xlSheet = xlBook.Worksheets(SheetName) Set Wcell = xlSheet.Range("A1") Set Cn = CurrentProject.Connection Rs.Open "取込みテーブル", Cn, adOpenKeyset, adLockOptimistic xlApp.Application.Visible = True   データを取込むコードあり(省略) xlBook.Close xlApp.Visible = False Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing Next SheetCount

  • VBAにて新規ブックへ既存シートのコピー

    みなさんのお力を貸して下さい。 現在エクセルマクロにて新規ブックを作成し、作成したブックへ既存のシートをコピーをしたいと思っています。 しかし、コピーメソッド実行時にエラー1004 WorksheetクラスのCopyメソッドが失敗しましたというエラーが発生して困っています。 Dim oXls As Object Dim oWbk As Object Dim oSheet As Object Set oXls = CreateObject("Excel.Application") Set oWbk = oXls.Workbooks.Add ThisWorkbook.Worksheets("Sheet1").Copy Before:=oWbk.Worksheets("Sheet1")  どなたかご教授、よろしくお願いします。

  • 【VB.NET】事後バインディングにおける引数の宣言方法

    【VB.NET】事後バインディングにおける引数の宣言方法  今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  開発環境:VB2008+XP になります。  Excel操作コードの部分を事後バインディングにすべく 勉強いたしております。  たとえば   「事前バインディング」     Dim myApp As New Excel.Application     Dim myBook As Excel.Workbook     Dim myBooks As Excel.Workbooks = myApp.Workbooks     Dim xlSheet As Excel.Worksheet     Dim xlSheets As Excel.Sheets       ↓   「事後バインディング」     Dim myApp As Object     Dim myBook As Object     Dim myBooks As Object     Dim xlSheet As Object     Dim xlSheets As Object     myApp = CreateObject("Excel.Application")     myBook = myApp.WorkBook     myBooks = myApp.WorkBooks     xlSheet = myApp.Worksheet     xlSheets = myApp.Sheets のようにするのだと思うのでございますが、  Sub Excel2(ByRef myRng As Excel.Range, ・・・・)                  ↑ここはどうやって宣言すべき                    なのでございましょうか???  「Sub Excel2」内ではmyAppが宣言されておりませんゆえ myApp.Rangeなどといたしますと「宣言されていません」とエラーが 出てしまうと思うのでございますが。。。。       もしお詳しい方がいらっしゃいましたら、是非ともアドバイスいただきたく お願い申し上げます。

  • ACCESSのVBAについて

    ACCESSのVBAを使って、データの集計・分析などをしてEXCELに出力、さらにそのEXCELを少しいじる、←このVBAをVBSで実行 といった事をしていたのですが、 会社の端末が一部Office2003から2010に変わったため、参照設定に不具合が出てきました。 内容は、元々2003で作成されたデータベースを2010で開くとVBAの参照設定が「Microsoft Access 11.0 Object Library」だったものは「Microsoft Access 14.0 Object Library」に変わるのですが、 「Microsoft Excel 11.0 Object Library」は変更されずに参照不可になってしまいます。 以前、別のところで同様の質問をした際に、 →「参照設定」をして、コードを作成したあと、コードに使われている定数を全部調べ上げて、変数宣言のコードを作成し、 参照設定のチェックを外して、宣言のコードを追加する、ということで、参照設定の対策をします。 といった回答を頂いたのですが、いまいち理解できていません。 以下のコードをEXCELの参照設定を外しても動くようにするにはどのようにしたら良いのでしょうか?よろしくお願いします。 Sub TEST() Dim xls As Excel.Application Dim wb As Excel.Workbook DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "TEST", "C:\TEST.xls", True Set xls = CreateObject("Excel.Application") Set wb = xls.Workbooks.Open("C:\TEST.xls") With xls .Sheets("Sheet1").Select .Range("A1").Value = "成功" .Visible = True End With End Sub

  • ACCESS VBAで作成済のExcelのコピーを作りたい

    ACCESS VBAで作成済みのExcelファイル (複数シートがあります)の コピーを作成し そのファイルでテーブルのデータを 出力したいと思っています。 シートが1つならできましたが シートが複数あるとできません。 できる方法を教えてください。 なおシートが一つの場合は、下記でできました。 Dim oXLS As New Excel.Application Dim NewBook As Excel.Workbook oXLS.Workbooks.Open Filename:=既存ファイル名 oXLS.ActiveWorkbook.Sheets(シート名).Copy Set NewBook = oXLS.ActiveWorkbook oXLS.Workbooks(ファイル名).Close 複数シートがある場合の 作成方法を教えてください。 よろしくお願いします。

  • Access2000:VBAを使用し、エクセルセルにDo文を使って挿入

    VBAでDo文を使って連続するセルに挿入したい場合 ロジックの書き方を教えていただけますか? あくまでもDo文を使ってです。 Dim ExcelApp As Object 'Excel.Application Dim Book As Object 'Excel.Workbook Dim Sheet As Object 'Excel.Worksheet ・・・略・・・ Sheet.Range("A13").Value 「A13」から下のセルに書き込んでいくものです。 Doの抜け出し方などはわかっています。 よろしくお願いします。

  • AccessからExcelのVBAを動かしたい

    2002です。 Excel_A.xlsからExcel_B.xlsのFromAccessプロシージャを実行する場合、 Application.Run "'" & ActiveWorkbook.Path & "\Excel_B.xls'!FromAccess" でいけたのですが、、、 Access_A.mdbから次のようにやると Application.Run "'" & CurrentProject.Path & "\Excel_B.xls'!FromAccess" エラーになります。 それで、次のようにやってみたら動いたのですが、FromAccessが一気に終了して しまい、デバッグできません。 Dim myExcel As Object Set myExcel = CreateObject("Excel.Application") Set myExcel = GetObject(CurrentProject.Path & "\Excel_B.xls", "Excel.Sheet") myExcel.Application.Visible = True myExcel.Application.UserControl = True myExcel.windows(1).Visible = True myExcel.Application.Run "FromAccess" デバッグしながら、AccessからExcelのプロシージャを実行するにはどうしたらいいのでしょうか?

  • アクセス(2003)のVBAでビット演算方法

    エクセルのマクロではビット演算ができましたが、アクセスではどのような方法があるのでしょうか? where in 文で値の自動生成も考えられますが、VBやVCでアドインも可能でしょうか教えてください。 '*********** Excel VBA Bit 演算 ************ Private Sub Boln() Dim MyBln As Boolean Dim Object1 As Range Dim Object2 As Range Set Object1 = Range("B11") Set Object2 = Range("B12") MyBln = Object1 And Object2 MsgBox MyBln End Sub '*********** Excel VBA Bit 演算 ************ 以上、宜しくお願いします。

  • Excel複数シートをaccessへ一括インポート

    Excel複数シートを、accessへ1つのテーブルへ一括インポート (1) ワークブックは複数あります。 (2) ブックには、色々な名前のシート名があります。 (3) テーブルに指定する名前をワークブックに合わせればと思ってます 複数シートの一括取り込みの vb は以下の通り作ってみました。 ここでは、 vbの中で「テーブル名」・「ドライブ内のワークブック(xlsデータ)」指定しなければいけないので、 任意で「テーブル名」・「ワークブック(xlsデータ)」「ドライブ」を(ダイアログボックスなど)指定出来ればと思っています。 ===================================================================== Private Sub コマンド0_Click() '////////////////////////////////////////////////////////// '/Excel複数シートのAccessテーブルへのインポート / '/参照設定 Microsoft Excel x.x Object Library / '////////////////////////////////////////////////////////// Const csWsRng As String = "A1:D1000" Const csTblName As String = "インポートテーブル" Const csWbPath As String = "D:\" Dim voXlApp As Excel.Application Dim voXlWb As Excel.Workbook Dim voXlWs As Excel.Worksheet Set voXlApp = New Excel.Application voXlApp.Visible = True Set voXlWb = voXlApp.Workbooks.Open(FileName:=csWbPath & "\aaaa.xlsx", _ ReadOnly:=True) For Each voXlWs In voXlWb.Worksheets DoCmd.TransferSpreadsheet TransferType:=acImport, _ SpreadsheetType:=acSpreadsheetTypeExcel9, _ TableName:=csTblName, _ FileName:=voXlWb.FullName, _ HasFieldNames:=True, _ Range:=voXlWs.Name & "!" & csWsRng Next voXlWs voXlWb.Close voXlApp.Quit Set voXlWs = Nothing Set voXlWb = Nothing Set voXlApp = Nothing End Sub ===================================================================== ご教示頂ければと思います。 宜しくお願い致します。

専門家に質問してみよう