gooID利用規約 改定のお知らせ

お世話になります。

現在、Accessにてツールを作成しておりますが、VBAより
特定のパスにあるExcelファイルのシート名を取得する必要が
あります。
※当該ツールはRuntime環境にて利用するため、CreateObject
 が利用できません。

取得はDAO.Tabledefs を使って取得できましたが、GetObjectを
使って取得する方法をご教授頂けると幸いです。

シート名を取得するExcelファイルが、 C:\test\テスト.xlsxの場合
どのような記述になりますでしょうか。

勉強不足で大変恐縮ですが、ご教授のほど宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

Access VBAよりExcelのシート名を取得


http://oshiete.goo.ne.jp/qa/8772873.html

ここでの OpenSchema を使用したものは不評だったでしょうか

というのは置いといて


関数を用意しました
いろんなパターンでテストはしていないので・・・
(完成形ではないので不具合等は修正してください)

GetExcelSheet に、Excelファイルのフルパスを与えると
シート名の配列が Variant で得られます。
内部でエラーがあったら、最後のエラー番号を返します。

内部の動きとして、GetObject で対象の Excel ファイルを開きます。
GetObject で初めて開かれた場合、そのファイルの Visible は False
False なら後始末としてそのファイルを閉じ、
結果 Excel で開いているファイルが無ければ、Excel を終了します。
つまり、既に開いていたものについては閉じる事はしません。

この関数の使い方は、後半の Samp1 を例としてください。

Public Function GetExcelSheet(sPath As String) As Variant
  Dim oApp As Object, oBook As Object
  Dim vA() As Variant, v As Variant
  Dim i As Long

  On Error Resume Next
  i = 0
  Set oBook = GetObject(sPath)
  If (Not oBook Is Nothing) Then
    For Each v In oBook.Worksheets
      ReDim Preserve vA(i)
      vA(i) = v.Name
      i = i + 1
    Next
    Set oApp = oBook.Application
    For Each v In oApp.Windows
      If (v.Caption = oBook.Name) Then
        If (Not v.Visible) Then
          oBook.Close SaveChanges:=False
        End If
        Exit For
      End If
    Next
    Set oBook = Nothing
    If (oApp.Workbooks.Count = 0) Then oApp.Quit
    Set oApp = Nothing
  End If
  GetExcelSheet = vA
  If (Err <> 0) Then GetExcelSheet = Err.Number
End Function

Public Sub Samp1()
  Dim v As Variant
  Dim sS As String
  Dim i As Long

'  v = GetExcelSheet(CurrentProject.Path & "\test.xlsm")
  v = GetExcelSheet("C:\test\テスト.xlsx")
  If (IsArray(v)) Then
    sS = "> シート数 = " & UBound(v) + 1 & vbCrLf
    For i = 0 To UBound(v)
      sS = sS & v(i) & vbCrLf
    Next
    MsgBox sS
  End If
End Sub


余談)

piroin654 さんのは

>  With appObj
>    For Each appObj In .Sheets

部分の、For Each 用の変数を変更すれば良いと思います。
また、Shell で起動しておくことは不要と思います。
(/Runtime オプション付きで起動した中での確認なので?)
    • good
    • 0
この回答へのお礼

30246kiku様
いつもご回答ありがとうございます。

教えて頂いた方法でうまくいきました。
GetExcelSheet ありがとうございます!今回に限らず使わせて
いただきます!

というか、そのままコピーしただけです。。
内容はまだ理解しておりません。


当該ツールは、ご回答頂いていた「抽出結果をExcelへ出力」
と同じもので、出力前に該当のシートが存在するか否かのチェックを
行う為、シート名の取得が必要となりました。

大変助かりました。ありがとうございました。

お礼日時:2014/10/22 19:43

たびたび、すみません。

うっかりが・・・。

もう一つ、

If StrComp(Right$(strFile1, 3), "xlsx", 1) = 0 Then

の、

Right$(strFile1, 3)

で、3を4にしてください。つまり、

If StrComp(Right$(strFile1, 4), "xlsx", 1) = 0 Then





回答には、ファイルが既に起動されている場合のエラー処理を
していません。必要ですかね。探せます?
    • good
    • 0
この回答へのお礼

piroin654様
度々のご回答ありがとうございます。

本来であれば、ご回答頂いた内容をちゃんと理解しつつ
作り込まなければならないのですが。。なかなか時間をとれず
結局教えて頂いたものをコピペし若干加工する程度です。

30246kiku様の方で関数を作って頂いたので、今回は
こちらを採用させて頂きたいと思います。

いつもご回答頂き感謝です。

お礼日時:2014/10/22 19:49

Shell(strFile2 & strFile3, vbHide)



のvbHideはプロセスが残るので、vbNormalFocusか、
vbNormalNoFocusにしてファイルを見えるように
しておいたほうがいいかもしれません。
    • good
    • 0

うっかりしていました。

起動していない場合はエラーが・・・。

やはり、Shellを用いてファイルを起動しておかないと
いけないですね。
方法はいろいろあるのですが、環境によってエラーが
でるかもしれませんが。わかりやすいところで以下のような
方法があります。

http://hanatyan.sakura.ne.jp/vbhlp/tap_kanren.htm

(やっていることは、No3の以下と同じですが。)
http://support2.microsoft.com/default.aspx?scid= …

この中の一部を使って、

Sub test()
  Dim strFile1 As String
  Dim strFile2 As String
  Dim strFile3 As String
  Dim ret As Long
  Dim appObj As Object
  strFile1 = "C:\test\テスト.xlsx"
  
  If StrComp(Right$(strFile1, 3), "xlsx", 1) = 0 Then
    strFile2 = "C:\Program Files\Microsoft Office\Office\Excel.exe "
    strFile3 = Chr$(34) & strFile1 & Chr$(34)
    ret = Shell(strFile2 & strFile3, vbHide)
  End If

  Set appObj = GetObject(strFile1)
  With appObj
    For Each appObj In .Sheets
      MsgBox appObj.Name
  Next
  End With

  Set appObj = Nothing
End Sub


なお、Shellの引数で、vbHideを使っています。引数は
いろいろあるので確認してみてください。
    • good
    • 0

すみません。

参照先がはずれていました。以下です。
http://support2.microsoft.com/default.aspx?scid= …
    • good
    • 0

No1です。

ランタイム環境がないので確認はしていませんが、ランタイムでの
実行については、以下の Run-Time Version of Microsoft Access
にあります。これはレポートを開く方法ですが、接続方法については
Shellを使ってExcelに接続することになると思われます。
    • good
    • 0

GetObjectを使ってならば、普通には、



Sub test()
  Dim appObj As Object
  Dim strFile As String

  strFile = "C:\test\テスト.xlsx"
  Set appObj = GetObject(strFile)

  With appObj
    For Each appObj In .Sheets
      MsgBox appObj
    Next
  End With

  Set appObj = Nothing
End Sub
    • good
    • 0
この回答へのお礼

piroin654さま
いつもご回答ありがとうございます。

教えて頂いた内容のファイルのパスの箇所を修正しました。

path = CurrentProject.path
strFile = path & "\テスト.xlsx"

実行してみたところ、
>MsgBox appObj
の箇所で、「実行時エラー438 オブジェクトは、このプロパティまたは
メソッドをサポートしていません。」とのエラーが表示されました。

どのようなことが考えられますでしょうか。
度々申し訳ございませんが、宜しくお願い致します。

お礼日時:2014/10/21 19:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccess VBAよりExcelのシート名を取得

お世話になります。
Access2010
Windows7 Pro

以下のページを参考にしましたが、「実行時エラー3170 インストール可能なISAMドライバーが見つかりませんでした。」と表示されてしまいます。

http://www.accessclub.jp/bbs5/0005/vba1231.html
Dim Db As DAO.Database
Dim Tbl As DAO.TableDef
Dim xlsFile As String

xlsFile = "ファイルパス"
Set Db = OpenDatabase(xlsFile, True, True, "Excel 14.0;") ←ここで止まる
For Each Tbl In Db.TableDefs
If Right$(Tbl.Name, 1) = "$" Or _
Right$(Tbl.Name, 2) = "$'" Then
'シート名の最後は必ず$が付きます
Debug.Print Tbl.Name
End If
Next Tbl
Db.Close
Set Db = Nothing

なお、参照設定にて「Microsoft DAO 3.6 Object Library」にチェックが入っていないことが原因かと思い、チェックを入れようとしましたが「この名前は既にあるモジュール、プロジェクト、オブジェクトライブラリで使われています。」というメッセージが表示され、チェックを入れることができません。

勉強不足で大変恐縮ですが、これらのメッセージからどういうことが分かりますでしょうか。
ご教授の程、宜しくお願い致します。

お世話になります。
Access2010
Windows7 Pro

以下のページを参考にしましたが、「実行時エラー3170 インストール可能なISAMドライバーが見つかりませんでした。」と表示されてしまいます。

http://www.accessclub.jp/bbs5/0005/vba1231.html
Dim Db As DAO.Database
Dim Tbl As DAO.TableDef
Dim xlsFile As String

xlsFile = "ファイルパス"
Set Db = OpenDatabase(xlsFile, True, True, "Excel 14.0;") ←ここで止まる
For Each Tbl In Db.TableDefs
If Right$(Tbl.Name, 1) = "$" Or _
Right$(...続きを読む

Aベストアンサー

Set Db = OpenDatabase(xlsFile, True, True, "Excel 14.0;") ←ここで止まる

Set Db = OpenDatabase(xlsFile, True, True, "Excel 12.0;") '←ここで止まる
ならOffice2010では出来ましたよ?
アプリケーションのバージョンではなくファイルのバージョン指定っぽいです。

ちょっと蛇足かもしれんが、参考になると思われます。
・・・本来 Null でない Excel 列内の一部の値が Null として返されることがあります・・・
http://support2.microsoft.com/kb/194124/ja

>この名前は既に・・・
Microsoft DAO 3.6 Object Library の上位バージョンの
Microsoft Office 14.0 Access Database Engine Object Library に
チェックが入っていれば OK です。

Qaccessへエクセルの複数のシートのインポートの仕方

エクセルの複数のシートをアクセスにインポートをするにはどうしたらいいのでしょうか?
シート数が40以上あって困っています。

できればVBAやマクロ等はわかりませんのでそれ以外の方法で無いでしょうか?
よろしく御願いいたします。

Aベストアンサー

VBAで書けば、例えば、こんな感じになります。
db1.xls というエクセルのファイルがあって、そのファイルに Sheet1、Sheet2、、、、、、Sheet40というシートが含まれている、という前提です。
(行替えやタブがここでうまく書けないので、読みにくいし、そのままコピーしてもうまく行かないかもしれません)

Sub A()
Dim I As Intege
For I = 1 To 40
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Sheet" & I, "db1.xls", True
Next
End Sub

F5で実行します。
データベースに、シートと同じ名前のテーブルができます。
同じシート名のテーブルがすでにあれば、インポートしたレコードは追加されます。

コードは実際に自分のパソコンで走らせて確認していますが、やる前に絶対にパックアップを取っておいてください。
お手元のデータベースがめちゃくちゃになってしまったら、私は、これも絶対に、直せません。

ポイントは DoCmd.TransferSpreadsheet という命令です。
引数は左から順番に、インポート、ソースはエクセル2000、シートの名前は Sheet**、ソースのファイル名は db1.xls、先頭行をフィールド名として使う、と言う意味です。

詳しくはヘルプで見ていただきたいと思います。
ヘルプはもしかしたら、デフォルトでインストールされていないかもしれません。
インストールされていれば、TransferSpreadsheet の部分のどこかにカーソルを置いて、F1で表示されます。
2番目の引数について、エクセル2000より後の場合にどうなるのかは、申し訳ないですが、知りません。
これについては、ヘルプで確認してください。

もし、シート名がこのように規則的な名前でなければ、この DoCmd.TransferSpreadsheet をシートの数だけ羅列します。

Sub A()
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "なんとか"db1.xls", True
DoCmd.TransferSpreadsheet acImport acSpreadsheetTypeExcel9, "かんとか"db1.xls", True
............(以下同様)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "ほにゃら"db1.xls", True
End Sub

さて、余談になりますが、今回きりの作業であれば、私なら、ひとつひとつインポートウィザードでインポートします。
高々、40シートですよね。スプレッドシートの構成や中身によりますが、1シートあたり10分もあれば、インポートできるのではないでしょうか。

TransferSpreadsheet メソッドでインポートしても、あとでフィールドのデータ型を変えたり、主キーを設定したり、という作業がそれぞれのテーブルで必要になるかもしれません。つまり、モジュールをつくってみても、それで終わりにはなりません。定期的なルーチン作業ならともかく、今回限りなら、大して手間は変わらないと思います。

VBAで書けば、例えば、こんな感じになります。
db1.xls というエクセルのファイルがあって、そのファイルに Sheet1、Sheet2、、、、、、Sheet40というシートが含まれている、という前提です。
(行替えやタブがここでうまく書けないので、読みにくいし、そのままコピーしてもうまく行かないかもしれません)

Sub A()
Dim I As Intege
For I = 1 To 40
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Sheet" & I, "db1.xls", True
Next
End Sub

F5で実行します...続きを読む

QACCESSのVBAにてExcelのシートをコピーしたい

入庫.xlsに現在、"原紙"というシートがあります。
入庫.xlsには、"原紙"と入庫のあった日のシートがあるようにしたいのです。
今日、入庫があれば、入庫.xlsには
"原紙"と"20"のシートが存在するようにしたいのです。
AccessのVBAにて1文でシートのコピーってできないでしょうか?
Dim oApp As Object
Dim StWk1 As String
Dim SHizk As String
Dim Hizk As Integer
Hizk = DatePart("d", Me![入庫日付])
SHizk = CStr(Hizk)
StWk1 = "c:入庫.xls"
Set Xls = GetObject(StWk1)
Xls.Application.Windows(1).Visible = True
Xls.Application.worksheets("原紙").Copy After:=Xls.Application.worksheets(SHizk)
Xls.Application.worksheets(SHizk).Activate

上記のように作成してみたのですが、実行すると、
Xls.Application.worksheets("原紙").Copy After:=Xls.Application.worksheets(SHizk)
のところで、エラーになります。
実行エラー'9':
インデックスが有効範囲にありません。
のメッセージが表示されます。
教えてください。

入庫.xlsに現在、"原紙"というシートがあります。
入庫.xlsには、"原紙"と入庫のあった日のシートがあるようにしたいのです。
今日、入庫があれば、入庫.xlsには
"原紙"と"20"のシートが存在するようにしたいのです。
AccessのVBAにて1文でシートのコピーってできないでしょうか?
Dim oApp As Object
Dim StWk1 As String
Dim SHizk As String
Dim Hizk As Integer
Hizk = DatePart("d", Me![入庫日付])
SHizk = CStr(Hizk)
StWk1 = "c:入庫.xls"
Set Xls = GetObject...続きを読む

Aベストアンサー

Private Sub CmdCopySheet_Click()
  
  'Dim xlApp As Excel.Application
  'Dim xlBook As Excel.Workbook
  'Dim xlSheet As Excel.Worksheet
  Dim xlApp As Object
  Dim xlBook As Object
  Dim xlSheet As Object
  Dim stFileName As String
  Dim stSheetName As String
  Dim lngCnt As Long
  
  'ファイル名指定
  stFileName = "C:\入庫.xls"
  
  'コピーシート名指定
  stSheetName = Format(Date, "dd")
  
  'エクセル展開
  'Set xlApp = New Excel.Application
  Set xlApp = CreateObject("Excel.Application")
  Set xlBook = xlApp.Workbooks.Open(stFileName)
  
  'コピー先取得
  For Each xlSheet In xlBook.Worksheets
    If xlSheet.Name = stSheetName Then
      If Len(stSheetName) = 2 Then
        stSheetName = stSheetName & " (2)"
      Else
        stSheetName = Left(stSheetName, 2) & " (" & Val(Mid(stSheetName, 5)) + 1 & ")"
      End If
    End If
    lngCnt = lngCnt + 1
  Next
  
  'シートコピー
  Set xlSheet = xlBook.Worksheets("原紙")
  xlSheet.Copy , xlBook.Worksheets(lngCnt)
  
  'シート名変更
  lngCnt = lngCnt + 1
  Set xlSheet = xlBook.Worksheets(lngCnt)
  xlSheet.Name = stSheetName
  
  'エクセルファイルを閉じる
  xlBook.Close (True)
  xlApp.Quit
  
  'オブジェクトの開放
  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
  
  '完了メッセージ
  MsgBox "シートをコピーしました"
  
End Sub

作成時は、参照設定で「Microsoft Excel *.* Object Library」にチェックをつけておくと楽ですよ
作成し終わったら、CreateObjectを使って参照設定を元に戻しておけば、バージョン違いのエクセルにも対応できます

Private Sub CmdCopySheet_Click()
  
  'Dim xlApp As Excel.Application
  'Dim xlBook As Excel.Workbook
  'Dim xlSheet As Excel.Worksheet
  Dim xlApp As Object
  Dim xlBook As Object
  Dim xlSheet As Object
  Dim stFileName As String
  Dim stSheetName As String
  Dim lngCnt As Long
  
  'ファイル名指定
  stFileName = "C:\入庫.xls"
  
  'コピーシート名指定
 ...続きを読む

QAccess エクセルシート名変更

お世話になります。
WindowsXPでAccess2002を使用しているのですが、AccessVBAを使い特定のエクセルシートのシート名を変更したいと考えているのですが、いろいろ方法を検索しているのですが、そのような事例を発見する事ができませんでした。

引き続き調べて行きますが、良い方法がありましたら、ご教授いただけないでしょうか。
宜しくお願いします。

Aベストアンサー

Excelがインストールされている環境なら
CreateObjectやNewでExcel.Applicationオブジェクトを作成して
その上で Bookを読み込み Worksheetの名前を変更すればいいのでは

sub Macro1()
Dim oXL as Object
Dim oWB as Object
Dim oSH as Object]
  Set oXL = CreateObject("Excel.Application")
  Set oWB = oXL.WorkBooks.Open("ブックのファイルパス")
  Set oSH = oWB.Worksheeets("シート名")
  oSH.Name = "変更後のシート名"
  oWB.Save
  oWB.Close
  oXL.Quit
  Set oSH = nothing
  Set oWB = nothing
  Set oXL = nothing
End Sub
といった具合でしょう

Qアクセスからエクセルのシートを追加して、名前をつける方法

アクセス2000で、ある所定の条件を満たした時に、規定の場所にあるエクセルファイルの先頭から2番目に空のワークシートを追加し、そのシート名を変数に格納されている値でリネームしようとしております。結構急務なんですが、excel.application~等使っても出来ませんでした・・・。プロフェッショナルな方、誰か方法を教えていただけないでしょうか?よろしくお願いします。

Aベストアンサー

こんにちは。

急ぎということで、取り急ぎで作ったコードです。目的の処理以外は一切おこなっていませんので、カスタマイズしてください。

また、処理速度の点で実行時バインドではなく、参照設定を予め行って下さい。


Option Compare Database

'要参照設定:Microsft Excel x.x Object Library
Sub AddXLWorksheet()

  Dim xlApp As Excel.Application
  Dim WB As Excel.Workbook
  Dim SH As Excel.Worksheet
  Dim strXLfile as stirng

  strXLfile = "C:\TEST.xls" 'Excelブックフルパス

  Set xlApp = Excel.Application
  With xlApp
    .Visible = True
    Set WB = .Workbooks.Open(strXLfile)
    'シートを3番目に追加
    Set SH = .Worksheets.Add(After:=WB.Worksheets(2))
    'シート命名
    SH.Name = "aaaaa" 'ここを変数で渡せば良い
  End With

  Set SH = Nothing
  Set WB = Nothing
  Set xlApp = Nothing

End Sub

こんにちは。

急ぎということで、取り急ぎで作ったコードです。目的の処理以外は一切おこなっていませんので、カスタマイズしてください。

また、処理速度の点で実行時バインドではなく、参照設定を予め行って下さい。


Option Compare Database

'要参照設定:Microsft Excel x.x Object Library
Sub AddXLWorksheet()

  Dim xlApp As Excel.Application
  Dim WB As Excel.Workbook
  Dim SH As Excel.Worksheet
  Dim strXLfile as stirng

  strXLfile = "C:\TEST.xls" 'Excel...続きを読む

QACCESSのVBで、エクセルファイルの最終行を取得

題名の通り
ファイルの最終行を知りたいのです
ざっと
エクセルファイルをオープンするは下記のように
すると思いますが
その後、最終行を取得するのに、どうするのか
教えてください
ーーーーーーーーー------------
Set Xls = GetObject("エクセルのファイル")
Xls.Application.Windows(1).Visible = True
Xls.Application.worksheets("Sheet1").Activate

Aベストアンサー

Xls.Application.worksheets("Sheet1").Rows.Count

を使用するのが一般的なようです。

QACCESSからexcelブックを開いて保存したい

ACCESS初心者です。
仕事でどうしても必要に迫られて、受付管理のツールを作ることになりました。


1つの注文で、受付ID(オートナンバー)が付与されます。

メインフォームにタブオーダーをつけてサブフォームを複数配置しています。
そのサブフォームにボタンを置いて
Access から既存のエクセルファイルをテンプレートとして開いて
テンプレートに入力後、受付IDをファイル名にして、テンプレートとは別もので保存
保存後は、ボタンを押したときに受付IDと同じエクセルファイルが開く

このようなことをやりたいと思っています。

ネットでいろいろ探しているのですが
ファイルを開くのは見つかっても、保存したものを開くのが見つからず
そもそもできるのかどうかもわかっておりません。

自分にスキルがなく、あれこれ凝ったものは作れないので、
保存は自動じゃなくて、自分で別名で保存にしてもかまわないのですし
フォームに入力したものが、テンプレートに反映(出力?)されなくてもかまわないです。


参考になるサイト等ありましたら、ご教示いただけますか。

どうぞよろしくお願いいたします。


下記はやりたいことに近いかなと思って見つけたサイトです。
http://www.nurs.or.jp/~ppoy/access/access/acX013.html
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220895032
http://accessclub.jp/bbs/0227/beginers70136.html

ACCESS初心者です。
仕事でどうしても必要に迫られて、受付管理のツールを作ることになりました。


1つの注文で、受付ID(オートナンバー)が付与されます。

メインフォームにタブオーダーをつけてサブフォームを複数配置しています。
そのサブフォームにボタンを置いて
Access から既存のエクセルファイルをテンプレートとして開いて
テンプレートに入力後、受付IDをファイル名にして、テンプレートとは別もので保存
保存後は、ボタンを押したときに受付IDと同じエクセルファイルが開く

このよう...続きを読む

Aベストアンサー

1番目のリンクの方のサイト、すごいですね。テクニカルかつ分かりやすいです。
同じ方のサイト、#001ではEXCELファイルを新規に作って、データベース内のデータを埋めて保存して閉じる
やり方を紹介しています。
http://www.nurs.or.jp/~ppoy/access/access/acX001.html

リンクの#013では、テンプレートを元にデータを埋め込み、EXCELの画面を表示したところで、マクロを終了させる
(保存はユーザーの手動に任せる)方法を紹介しています。

この#013の最後に#001の保存方法を組み合わせれば、たぶん出来ると思います。

#013の末尾(http://www.nurs.or.jp/~ppoy/access/access/acX013.html)
--------------------------------------------------------------
'データ貼り付け
With wkb.Worksheets(stSheet)
.Range(stRng).CopyFromRecordset Data:=rst
End With

'#001の保存コード(http://www.nurs.or.jp/~ppoy/access/access/acX001.html)

'保存ダイアログからの入力を受けて保存
' fName = xls.Application.GetSaveAsFilename(,"Microsoft Excel(*.xls),*.*", 1)

'保存ダイアログを使わず、fnameを自動的に指定する方法(jacob-wk9付け足し)
fName=rst!受付ID

If fName <> False Then
wkb.SaveAs FileName:=fName
MsgBox "新規ブックは、「" & fName & "」の名前で保存しました!", vbOKOnly
Else
MsgBox "新規ブックは保存できませんでした。", vbOKOnly
End If

Set rst = Nothing: Set cnn = Nothing

Exit_opnXLtmp:
Set wkb = Nothing: Set xls = Nothing
Exit Sub

Err_opnXLtmp:
MsgBox Err.Description
Resume Exit_opnXLtmp
End Sub
----------------------------------------------------------------------

こんな感じになるのではないでしょうか。

1番目のリンクの方のサイト、すごいですね。テクニカルかつ分かりやすいです。
同じ方のサイト、#001ではEXCELファイルを新規に作って、データベース内のデータを埋めて保存して閉じる
やり方を紹介しています。
http://www.nurs.or.jp/~ppoy/access/access/acX001.html

リンクの#013では、テンプレートを元にデータを埋め込み、EXCELの画面を表示したところで、マクロを終了させる
(保存はユーザーの手動に任せる)方法を紹介しています。

この#013の最後に#001の保存方法を組み合わせれば、...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccessからExcelファイルのデータ取得

Access2000かExcelファイルのデータを取得したいのですが、
Excelファイルを一度 CSVファイルに変換し、その後Accessのテーブルへデータ取り込み といった手順をとりたいのです。
この方法って、どうコーディングすればいいのですか?
(Accessのインポート処理は使用しない方法です)

Aベストアンサー

VBAの基本的なことはご存知ですか?
でしたら、
1.Accessで対象のExcelファイルを選択
2.AccessからExcelを制御してCSVにコンバート
3.出来たCSVファイルをAccessに取り込む(テキスト取り込み インポート定義を使うと簡単)
この順序で行えばOKです。
ExcelでVBAを書くことで制御する方法もありますが、
Access側からExcelを制御する方がやりやすいと思います。

QAccessからVBAでExcellシートのインポート

すみません。教えてください。
AccessVBAでエクセルのシートをインポートしたいのです。
いつも同じ行数ではありませんのでrange指定を埋め込むわけに行きません。
DoCmd.TransferSpreadsheet acImport, , "給与データ報告書", "c:\test\test.xls", True, "a1:p6000"
でインポートできるのですが
DoCmd.TransferSpreadsheet acImport, , "給与データ報告書", "c:\test\test.xls", True, ""
range指定をしないとエラーになります。(出来ると書いてあるが)
sheet1、ワークシート名とかの指定が出来ればと思い、いろいろ試してみたのですが出来ません。
宜しくお願いいたします。

Aベストアンサー

うまくいかない場合は原因を追及することをお勧めします。

とりあえずマクロで正常に動くかをやってみれば、VBAの構文のミスなのか、それ以外に原因があるのかわかるかと思います。

マクロのアクションに「ワークシート変換」を選択し、下記内容の設定をしてみてください。

変換の種類:      インポート
ワークシートの種類:  Microsoft Excel 8-9
テーブル名:    給与データ報告書
ファイル名:      c:\user\test.xls
範囲名:        給与データ報告書!

このマクロが正常に動くかどうかを確認して、正常に動けば「マクロをVisualBasicに変換」を行ってVBAスクリプトを確認することができると思います。
マクロが正常に動かなければ、シート名を英数だけの名称にするなど簡単なものしてどうなるかを確認してみてください。

少なくともこちらでは同様の内容でインポートできていますので、MDB自身に何か問題があるのかもしれません。その場合一度最適化をすると正常に動くようになるかもしれません。

うまくいかない場合は原因を追及することをお勧めします。

とりあえずマクロで正常に動くかをやってみれば、VBAの構文のミスなのか、それ以外に原因があるのかわかるかと思います。

マクロのアクションに「ワークシート変換」を選択し、下記内容の設定をしてみてください。

変換の種類:      インポート
ワークシートの種類:  Microsoft Excel 8-9
テーブル名:    給与データ報告書
ファイル名:      c:\user\test.xls
範囲名:        給与データ報告書!

...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報