3

こんにちは。ご協力ありがとうございます。ここで私たちのオフィスで使用するための一見単純な Access データ管理ソリューションをまとめていますが、vba のバックグラウンドがせいぜい最小限であるため、問題が発生しています。

ここにあるのは、2 つの関連しているが接続されていない Access 2007 アプリケーションです。ユーザーがこの情報を簡単にインポートおよびエクスポートできるシステムが必要です。アプリケーションからすべてのテーブルを、各テーブルを別のワークシートとして 1 つの Excel ファイルにエクスポートするスクリプトが動作しています。問題は、インポートしようとすると、最初のシートしか見つからないように見えることです。

私が見つけたいと思っているのは、各ワークシートを反復処理し、シート名を取得し、シート名に基づいてそのデータをテーブルにマージする方法です。

明確にするために:

  • アプリ A の複数のコピーがさまざまな部門に送信されます
  • アプリ A: ユーザーがテーブルに情報を入力する
  • アプリ A: ユーザーがコマンドを押してエクスポート マクロを実行する
  • Excel ファイルは、一致する名前 (tblCourse、tblStudent、tblFaculty など) を持つシートとして各テーブルで作成されます。
  • アプリ B のユーザーは Excel スプレッドシートを受け取ります
  • アプリ B: ユーザーがコマンドを押してインポート スクリプトを実行します (これが私が探しているソリューションです)
    • ユーザーはファイルの場所を求められます
    • インポート スクリプトで Excel ワークブックを開く
    • スクリプトは各シートを反復し、名前を読み取り、一致する名前のテーブルにデータをインポートします

あなたが提供できる助けを前もって感謝します。

編集

作業スクリプト (ここで grahamj42 の助けに大いに感謝します):

Private Sub Command101_Click()

'Dim excelapp As New Excel.Application
Dim excelApp As Object
Set excelApp = CreateObject("Excel.Application")
'Dim excelbook As New Excel.Workbook
Dim excelbook As Object
Set excelbook = excelApp.Workbooks.Add
'Dim excelsheet As New Excel.Worksheet
'Dim excelsheet As Object
'Set excelsheet = excelbook.Sheets
Dim intNoOfSheets As Integer, intCounter As Integer
Dim strFilePath As String, strLastDataColumn As String
Dim strLastDataRow As String, strLastDataCell As String

strFilePath = "C:\Users\UserName\Documents\Export\DatabaseExport03-28-2013.xlsx"

Set excelbook = excelApp.Workbooks.Open(strFilePath)

 intNoOfSheets = excelbook.worksheets.Count

 Dim CurrSheetName As String

 For intCounter = 1 To intNoOfSheets
  excelbook.worksheets(intCounter).Activate
   DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, ActiveSheet.Name, _
   strFilePath, True, _
   excelbook.Worksheets(intCounter).Name & "!" & _
   Replace(excelbook.Worksheets(intCounter).UsedRange.Address, "$", "")
 Next

excelbook.Close
excelApp.Quit
Set excelApp = Nothing

End Sub

DoCmd.TransferSpreadsheet コマンドには、スプレッドシートがフィールド名を列ヘッダーとしてエクスポートするため、ここで「True」に設定されている HasFieldNames プロパティがあることに注意してください。

4

2 に答える 2

3

何も選択せずに を使用するとSelection、保存時にワークシートで選択されたセルが参照されます。あなたの場合、なぜこれがテーブルの外にある必要があるのか​​ わかりませんが、次を使用して何も選択せずに、このようにすることをお勧めしますWorksheet.UsedRange

For intCounter = 1 To intNoOfSheets

  DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, Activesheet.Name, _
    strFilePath, True, _
    excelbook.Worksheets(intCounter).Name & "!" & _
    Replace(excelbook.Worksheets(intcounter).UsedRange.Address, "$", "")

Next
于 2013-03-28T19:28:41.730 に答える