0

私は、Excel (一括データ入力用) と Access (データを格納するため) を使用して、非常に基本的なデータ入力とデータベース システム アプリケーションを作成しています。zipファイルとして配布するためにプレイします。それが機能するためには、ファイル構造を変更せずに c:/ ドライブに解凍する必要があります。zipファイルを特定の場所に強制的に解凍する方法はありますか?

これが必要な理由は、入力されたデータのアップロードを自動化するためです。私の知る限り、Access VBA でデータをインポートするには、VBA で完全なファイルパスを指定する必要があります。

*更新

私を森から連れ出してくれたRemouに感謝します。後世のために、これが私がそれを解決した方法です。最もきれいなコードではありませんが、それは仕事をします。最初にインポート機能、次にエクスポート機能。

インポート、アップロードするファイルには命名規則が必要ですが、ファイルはどこからでも取得できます。そのファイル名は、それらが格納されるテーブルに関連しています。Excel シートの最後で、データ入力シートが 2 つに分割されます (Rec と Occ)。

次のようにコードします。

関数 importData_Click (オプションの varDirectory As String, _ オプションの varTitleForDialog As String) As String

Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As String
Dim strFileName As String
Dim strTableName As String
Dim strColumnName As String
Dim The_Year As Long
Dim occNumber As Long



'Get combobox value and assign relavent values to occNumber
The_Year = Forms![Upload Data]!Year_Combo.value

'Ask the to check value
If MsgBox("Uploading " & The_Year & " data" & vbCrLf & "Continue?", VbMsgBoxStyle.vbYesNo) = 7 Then
    Exit Function
End If



If The_Year = 2012 Then
    occNumber = 1000
    ElseIf The_Year = 2013 Then
    occNumber = 2000
End If

' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
lngFlags = ahtOFN_FILEMUSTEXIST Or _
            ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
If IsMissing(varDirectory) Then
    varDirectory = ""
End If
If IsMissing(varTitleForDialog) Then
    varTitleForDialog = ""
End If

strFilter = ahtAddFilterItem("Excel Files (*.xlsx)", "*.xlsx")

varFileName = ahtCommonFileOpenSave( _
                                openFile:=True, _
                                InitialDir:=varDirectory, _
                                Filter:=strFilter, _
                                Flags:=lngFlags, _
                                DialogTitle:=varTitleForDialog)
If Not IsNull(varFileName) Then
    varFileName = TrimNull(varFileName)

End If
importData_Click = varFileName

'Sets filename
strFileName = Dir(varFileName)

'Sets TableName
strTableName = Left(strFileName, 4)

If IsNull(strFileName) Then
    MsgBox "Upload cancelled"
    Exit Function
End If






    'Checks naming convetions of filenames

    If strTableName Like "*MN" Or strTableName Like "*OP" Or strTableName Like "*DA" Or strTableName Like "*TR" Then

            'Checks if data is Opportunistic
            If strTableName Like "*OP" Then

            strColumnName = "Year_" & strTableName


                        'Checks to see if that year's data already exists
                        If DLookup(strColumnName, strTableName & "_Rec", "" & strColumnName & " = " & The_Year & "") Then

                        MsgBox "2012 data is already present"

                        ElseIf DLookup(strColumnName, strTableName & "_Rec", "" & strColumnName & " = " & The_Year & "") Then

                        MsgBox "2013 data is already present"

                        Else

                        'Uploads data to relevant table
                        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTableName & "_Rec", varFileName, True, "Rec_Prep$"

                        MsgBox "Upload successful"

                        End If



            Exit Function

            Else

            strColumnName = "Occasion_" & strTableName




                        'Checks Occasions to see if that year exists
                        If DLookup(strColumnName, strTableName & "_Rec", "" & strColumnName & " = " & occNumber & "") Then

                        MsgBox "2012 data is already present"

                        ElseIf DLookup(strColumnName, strTableName & "_Rec", "" & strColumnName & " = " & occNumber & "") Then

                        MsgBox "2013 data is already present"

                        Else
                        'Uploads to Records table and Occasion table
                        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTableName & "_Occ", varFileName, True, "Occ_Prep$"

                        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTableName & "_Rec", varFileName, True, "Rec_Prep$"

                        MsgBox "Upload successful"

                        End If

            End If

    Else

    MsgBox "Your file is named incorrectly! & vbCrLf & Please refer to the Data Dictionary & vbCrLf & for correct naming conventions"

    Exit Function

    End If





'DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "BaMN_AllData", strSaveFileName



End Function


Private Function TrimNull(ByVal strItem As String) As String
Dim intPos As Integer

intPos = InStr(strItem, vbNullChar)
If intPos > 0 Then
    TrimNull = Left(strItem, intPos - 1)
Else
    TrimNull = strItem
End If
End Function

次に、エクスポートはコマンド ボタンの名前 (テーブル名と一致する) を使用して、ユーザーが望む場所にエクスポートします。

 Dim queryYear As Variant

'Function to export data to location of users choice.  Query name is automatically     detected from the control button used
'Year is derived from the combobox value on [Extract Data] form, null value defaults to all years.
 Function exportData_Click()


Dim strFilter As String
Dim strSaveFileName As String
Dim The_Year As Variant

Dim ctlCurrentControl As Control
Dim queryName As String



'Get the name of the control button clicked (corresponds to query name to be run)
Set ctlCurrentControl = Screen.ActiveControl
queryName = ctlCurrentControl.Name



'Get combobox value and assign relavent values to The_Year
The_Year = Forms![Extract Data]!Extract_Year.value


'Change the year from a variant to what we need in the SQL

If The_Year Like "20*" Then
    The_Year = CInt(The_Year)
    MsgBox The_Year & "Data Type = " & VarType(The_Year)
Else: The_Year = "*"
MsgBox The_Year & "Data Type = " & VarType(The_Year)
End If

'Set queryYear variable
setYear (The_Year)


'Check the variable is correct
'MsgBox getYear()

'Open the Save as Dialog to choose location of query save

strFilter = ahtAddFilterItem("Excel Files (*.xlsx)", "*.xlsx")

strSaveFileName = ahtCommonFileOpenSave( _
                                openFile:=False, _
                                Filter:=strFilter, _
                Flags:=ahtOFN_OVERWRITEPROMPT Or ahtOFN_READONLY)

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, queryName, strSaveFileName

End Function
 'Function to set queryYear used in data extraction queries
Public Function setYear(The_Year As Variant)

 queryYear = The_Year

End Function

 'Function to get queryYear used in data extraction queries
 Function getYear()

  getYear = queryYear

 End Function

ファイルの保存とファイルを開くコード セクションは私のものではないことに注意してください。これらは Ken Getz によるもので、コード全体は次の場所にあります。

http://access.mvps.org/access/api/api0001.htm

4

1 に答える 1

2

アプリケーション パス ( currentproject.Path など) を使用するか、データ ストアの場所を指定するようにユーザーに依頼する方が、ユーザーが利用できない場所に強制的にインストールしようとするよりも適切です。パスをハードコーディングする必要はまったくありません。Access では、データ パスなど、プロジェクトに関連する情報をテーブルに格納できます。Excel から MS Access を検索できます。

于 2012-09-05T14:27:41.263 に答える