0

私は、(100 人以上の) 従業員ごとに 3 つの行 (標準時間、残業、2 倍の時間) を持ち、サイトのコスト コードごとに 1 つの列を持つ Excel のタイムシート システムを持っています。これは最終的に巨大な行列になり、そのほとんどは空です。私の解決策は、基本的に、単一のコストコードの従業員情報と時間を格納する従業員データ型を作成することです。

   Public Type Employee
     Name As String
     Trade(1 To 3) As String
     EmpNum As Long
     Comment As String
     AddOns(1 To 3) As Single
     Allowance(1 To 3) As Single
     Contract As Long
     CostCode As Long
     STHours As Single
     OTHours As Single
     DTHours As Single
     WorkDate As Date
   End Type

スプレッドシートを処理し、従業員型オブジェクトの配列として Excel で情報を整理することはできますが、これを Access にエクスポートする方法に慣れておらず、ほとんどの質問は Excel セルから Access へのエクスポートに関するものです。もちろん、これらのオブジェクトを別のワークシートのセルに配置してそのようにすることもできますが、もっと良い方法があるはずです。

現在、私の最良の推測は次のようなものです。

VBAを使用してExcelからAccess 2010にデータを挿入する

しかし、エクスポートごとにテーブルを100回以上更新することになります。

VBA でテーブル オブジェクトを作成し、それに配列情報を入力してから、1 回の更新で Access のテーブルの末尾に追加する効率的な方法はありますか?

ありがとう。

-ショーン

4

2 に答える 2

0

みんなの助けに感謝します...解決策のために思いついたことを共有したかっただけです。私はデータベースに1つのオブジェクトを挿入する関数を構築することになりました...インターウェブからコピーおよび変更されました。以下のコード、乾杯!

Public Function InsertTimeRecord(EmpData As Employee) As Boolean

Dim SaveTime As Date
Dim db As DAO.Database
Dim rs As DAO.Recordset

'//Database Location
Const DB_LOCATION = "C:\access\KMP Tracker.mdb"

'//If errors occur the function will exit with a return value of false (insertion failed)
On Error GoTo ErrHandler:

'//Table has a datecreated/datemodified timestamp for each record
SaveTime = Now

'//Open Database
If db Is Nothing Then
   Set db = DAO.Workspaces(0).OpenDatabase("C:\access\KMP Tracker.mdb") 'Removed DB_LOCATION
End If

'//Open Table
If rs Is Nothing Then
    Set rs = db.OpenRecordset("Timesheet Data", dbOpenDynaset)
End If

'//Create a new record
With rs
    .AddNew
    ![EmpName] = EmpData.Name
    ![Trade1] = EmpData.Trade(1)
    ![Trade2] = EmpData.Trade(2)
    ![Trade3] = EmpData.Trade(3)
    ![EmpNum] = EmpData.EmpNum
    ![Comment] = EmpData.Comment
    ![AddOns1] = EmpData.AddOns(1)
    ![AddOns2] = EmpData.AddOns(2)
    ![AddOns3] = EmpData.AddOns(3)
    ![Allowance1] = EmpData.Allowance(1)
    ![Allowance2] = EmpData.Allowance(2)
    ![Allowance3] = EmpData.Allowance(3)
    ![Contract] = EmpData.Contract
    ![CostCode] = EmpData.CostCode
    ![STHours] = EmpData.STHours
    ![OTHours] = EmpData.OTHours
    ![DTHours] = EmpData.DTHours
    ![WorkDate] = EmpData.WorkDate
    ![DateSubmitted] = SaveTime

    '//Insert Record into Database
    .Update
    InsertMachineHoursRecord = True '//SUCCESSFUL INSERTION
End With

'//Note that we use recordset in this example, but equally effective
'//  is to create an update query command text and simply run the update query:
'//  (INSERT INTO Table (Field1, Field2) VALUES (Value1, Value2);

'//Make sure we have closed the database
My_Exit:
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
Exit Function

ErrHandler:
MsgBox Err.Description
Resume My_Exit
End Function
于 2013-04-07T17:50:05.233 に答える