2016-08-29 9 views
0

私は複製しようとしている非常に大きなレコードを持っているし、新しい主キーIDを持つ新しいバージョンでフォームを開きます。これは、データをコピーするためにすべてのフィールドを反復処理することなく、Access VBAで実行できますか?新しいプライマリキー(VBA)で重複レコード

ありがとうございます!

+1

いいえ、VBAのすべてのフィールドを繰り返し処理するか、 'insert'クエリのすべてのフィールドをリストする必要があります。特に、それらのうちの1つをスキップしたいからです。 VBA側では、レコードセットのフィールドを 'For Each'でループすることができ、内部に' If'チェックしか持たず、プライマリキーをスキップすることができます。 – GSerg

答えて

3

最速と最も簡単な方法は、DAOを使用することで、フォームのRecordsetClone

Private Sub cmdDuplicate_Click() 

    Dim rstSource As DAO.Recordset 
    Dim rstInsert As DAO.Recordset 
    Dim fld   As DAO.Field 

    If Me.NewRecord = True Then Exit Sub 

    Set rstInsert = Me.RecordsetClone 
    Set rstSource = rstInsert.Clone 
    With rstSource 
    If .RecordCount > 0 Then 
     ' Go to the current record. 
     .Bookmark = Me.Bookmark 
     With rstInsert 
     .AddNew 
      For Each fld In rstSource.Fields 
      With fld 
       If .Attributes And dbAutoIncrField Then 
       ' Skip Autonumber or GUID field. 
       ElseIf .Name = "SomeFieldToPreset" Then 
       rstInsert.Fields(.Name).Value = SomeValue 
       ElseIf .Name = "SomeFieldToExclude" Then 
       ' Leave blank 
       Else 
       ' All other fields. 
       ' Copy field content. 
       rstInsert.Fields(.Name).Value = .Value 
       End If 
      End With 
      Next 
     .Update 
     ' Go to the new record and sync form. 
     .MoveLast 
     Me.Bookmark = .Bookmark 
     .Close 
     End With 
    End If 
    .Close 
    End With 

    Set rstInsert = Nothing 
    Set rstSource = Nothing 

End Sub 

これは新しいレコードに現在のレコードからフォームを移動します。これを簡単に変更して新しいIDを選択し、新しいレコードで他のフォームを開くことができます。

+0

ありがとう、そのソースコードです。レコードを複製するのと同じ問題がありました。このコードは、私が必要としていたものとまったく同じです。しかし、ちょうど追加するもの:ElseIfステートメントの中で、Thenは最後に欠けています。私はそれなしで(MS Access 2016を使用して)構文エラーを持っています。だから、誰かがこのソースコードで文法エラーを取得した場合は、Thenを次のように追加してください。 ElseIf .Name = "SomeFieldToPreset" Then – Bine

+0

ありがとう!あなたの発見を修正しました。 – Gustav

1

Duplicate Recordコマンドを参照してください。あなたはどちらかそれはボックス

enter image description here

から出てくると、それを使用するか、ウィザードによって生成されたコードを調査し、自分のためにカスタマイズすることができます。ウィザードを使用する方法では、PKが設定されている場合は、オートナンバー型のPKはコピーされません。

+0

この操作は、現在のレコードをembedマクロでコピーして貼り付けることによって行われます(ただし、マクロをvbaにエクスポートすることは可能です)。つまり、フォームに隠しフィールドが含まれていると、コピーや貼り付けが行われません。 –

+1

@willywonkaあなたが指摘していることについて驚くべきことは、フィールドがフォーム上にあるが表示されていない場合でも、コピーされないことです。はい、これは慎重に使用する必要があります。 – Brad

関連する問題