简体   繁体   English

Access 2010-导出到Excel-多行

[英]Access 2010 - Export to Excel - Multiple rows

For our customer I need to export the data of three queries to an Excel-Template, with three sheets. 对于我们的客户,我需要将三个查询的数据导出到一个带有三张纸的Excel模板。

Here is my first try: 这是我的第一次尝试:

Private Sub btnEmail_Click()
    Dim appExcel As New Excel.Application

    strQuery1 = "Z_SL_Liste_Komplett"
    strSQL1 = "SELECT * FROM Z_SL_Liste_Komplett"

    strQuery2 = "Z_SL_Liste_OK"
    strSQL2 = "SELECT * FROM Z_SL_Liste_OK"

    strQuery3 = "Z_SL_Liste_nicht_OK"
    strSQL3 = "SELECT * FROM Z_SL_Liste_nicht_OK"

    Set rst1 = CurrentDb.OpenRecordset(strQuery1)
    Set rst2 = CurrentDb.OpenRecordset(strQuery2)
    Set rst3 = CurrentDb.OpenRecordset(strQuery3)

    strTemplate = "\\WINSER8\Allgemein_Rala\LU\SL_Zeugnisablage" & "\Template.xlsx"

    Set wkb = appExcel.Workbooks.Add(Template:=strTemplate)
    Set sht1 = wkb.Sheets(1)
    Set sht2 = wkb.Sheets(2)
    Set sht3 = wkb.Sheets(3)
    appExcel.Visible = True

    'Write data for selected vehicle to cells of worksheet
    rst1.Edit
    sht1.Range("A6").Value = rst1![Ansprechpartner]
    sht1.Range("B6").Value = rst1![Rala SL-Nr]
    sht1.Range("C6").Value = rst1![Einsatzort]
    sht1.Range("D6").Value = rst1![Knd SL-Nr]
    sht1.Range("E6").Value = rst1![Hersteller/Schlauchtyp]
    sht1.Range("F6").Value = rst1![Alter]
    sht1.Range("G6").Value = rst1![DN]
    sht1.Range("H6").Value = rst1![Länge]
    sht1.Range("I6").Value = rst1![PN]
    sht1.Range("J6").Value = rst1![PS]
    sht1.Range("K6").Value = rst1![EL-Art]
    sht1.Range("L6").Value = rst1![AS 1 & 2]
    sht1.Range("M6").Value = rst1![Sicht-Ergebnis]
    sht1.Range("N6").Value = rst1![EL-Ergebnis]
    sht1.Range("O6").Value = rst1![Druck-Ergebnis]
    sht1.Range("P6").Value = rst1![Gesamtergebnis]
    sht1.Range("Q6").Value = rst1![Prüfer (Befähigte Person)]
    sht1.Range("R6").Value = rst1![Prüfintervall]
    sht1.Range("S6").Value = rst1![Bemerkung]
    sht1.Range("T6").Value = rst1![Farbcodierung]
    rst1.Update

    rst2.Edit
    sht2.Range("A6").Value = rst2![Ansprechpartner]
    sht2.Range("B6").Value = rst2![Rala SL-Nr]
    sht2.Range("C6").Value = rst2![Einsatzort]
    sht2.Range("D6").Value = rst2![Knd SL-Nr]
    sht2.Range("E6").Value = rst2![Hersteller/Schlauchtyp]
    sht2.Range("F6").Value = rst2![Alter]
    sht2.Range("G6").Value = rst2![DN]
    sht2.Range("H6").Value = rst2![Länge]
    sht2.Range("I6").Value = rst2![PN]
    sht2.Range("J6").Value = rst2![PS]
    sht2.Range("K6").Value = rst2![EL-Art]
    sht2.Range("L6").Value = rst2![AS 1 & 2]
    sht2.Range("M6").Value = rst2![Sicht-Ergebnis]
    sht2.Range("N6").Value = rst2![EL-Ergebnis]
    sht2.Range("O6").Value = rst2![Druck-Ergebnis]
    sht2.Range("P6").Value = rst2![Gesamtergebnis]
    sht2.Range("Q6").Value = rst2![Prüfer (Befähigte Person)]
    sht2.Range("R6").Value = rst2![Prüfintervall]
    sht2.Range("S6").Value = rst2![Bemerkung]
    sht2.Range("T6").Value = rst2![Farbcodierung]
    rst2.Update

    rst3.Edit
    sht3.Range("A6").Value = rst3![Ansprechpartner]
    sht3.Range("B6").Value = rst3![Rala SL-Nr]
    sht3.Range("C6").Value = rst3![Einsatzort]
    sht3.Range("D6").Value = rst3![Knd SL-Nr]
    sht3.Range("E6").Value = rst3![Hersteller/Schlauchtyp]
    sht3.Range("F6").Value = rst3![Alter]
    sht3.Range("G6").Value = rst3![DN]
    sht3.Range("H6").Value = rst3![Länge]
    sht3.Range("I6").Value = rst3![PN]
    sht3.Range("J6").Value = rst3![PS]
    sht3.Range("K6").Value = rst3![EL-Art]
    sht3.Range("L6").Value = rst3![AS 1 & 2]
    sht3.Range("M6").Value = rst3![Sicht-Ergebnis]
    sht3.Range("N6").Value = rst3![EL-Ergebnis]
    sht3.Range("O6").Value = rst3![Druck-Ergebnis]
    sht3.Range("P6").Value = rst3![Gesamtergebnis]
    sht3.Range("Q6").Value = rst3![Prüfer (Befähigte Person)]
    sht3.Range("R6").Value = rst3![Prüfintervall]
    sht3.Range("S6").Value = rst3![Bemerkung]
    sht3.Range("T6").Value = rst3![Farbcodierung]
    rst3.Update
End Sub

My problem is the direct "connection" A6; 我的问题是直接的“连接” A6; B6 etc. My source have more than one row. B6等。我的来源有多行。 So I need a loop or something like this. 所以我需要一个循环或类似的东西。 An array? 数组?

For example: In source are 5 rows, but later in Excel only one! 例如:在源中有5行,但在Excel中后来只有5行!

Please help me. 请帮我。

THX. 谢谢。

Vegeta77 Vegeta77

Quite a few issues with your code but I won't go into detail. 您的代码有很多问题,但我不会详细介绍。 I will only point out that it's very important to declare your variables by using Option Explicit at the top of each Module. 我只会指出,使用每个模块顶部的Option Explicit声明变量非常重要。

You can set it to be added automatically in Tools/Options/Require Variable Declaration of the VBA editor. 您可以在VBA编辑器的“工具/选项/要求变量声明”中将其设置为自动添加。

Here's a revised version of your code. 这是您代码的修订版。 Compare it with yours to see the differences. 将其与您的进行比较以查看差异。

Option Explicit

Private Sub btnEmail_Click()
    On Error GoTo ErrProc

    Const strTemplate = "\\WINSER8\Allgemein_Rala\LU\SL_Zeugnisablage\Template.xlsx"

    Dim strSQL1 As String, strSQL2 As String, strSQL3 As String

    strSQL1 = "SELECT * FROM Z_SL_Liste_Komplett"
    strSQL2 = "SELECT * FROM Z_SL_Liste_OK"
    strSQL3 = "SELECT * FROM Z_SL_Liste_nicht_OK"

    Dim rst1 As DAO.Recordset
    Set rst1 = CurrentDb.OpenRecordset(strSQL1)
    With rst1
        If Not .EOF Then
            .MoveLast
            .MoveFirst
        End If
    End With

    Dim rst2 As DAO.Recordset
    Set rst2 = CurrentDb.OpenRecordset(strSQL2)
    With rst2
        If Not .EOF Then
            .MoveLast
            .MoveFirst
        End If
    End With

    Dim rst3 As DAO.Recordset
    Set rst3 = CurrentDb.OpenRecordset(strSQL3)
    With rst3
        If Not .EOF Then
            .MoveLast
            .MoveFirst
        End If
    End With

    Dim errFlag As Boolean
    Dim appExcel As Excel.Application
    Set appExcel = New Excel.Application
        appExcel.Visible = True

    Dim wkb As Excel.Workbook
    Set wkb = appExcel.Workbooks.Add(Template:=strTemplate)

    Dim sht1 As Excel.Worksheet
    Set sht1 = wkb.Sheets(1)

    Dim sht2 As Excel.Worksheet
    Set sht2 = wkb.Sheets(2)

    Dim sht3 As Excel.Worksheet
    Set sht3 = wkb.Sheets(3)

    Dim counter_ As Long 
        counter_ = 6 'assuming starts at row 6

    Dim idx As Long
    With sht1
        For idx = 1 To rst1.RecordCount

            'Write data for selected vehicle to cells of worksheet
            .Range("A" & counter_).Value = rst1![Ansprechpartner]
            .Range("B" & counter_).Value = rst1![Rala SL-Nr]
            .Range("C" & counter_).Value = rst1![Einsatzort]
            .Range("D" & counter_).Value = rst1![Knd SL-Nr]
            .Range("E" & counter_).Value = rst1![Hersteller/Schlauchtyp]
            .Range("F" & counter_).Value = rst1![Alter]
            .Range("G" & counter_).Value = rst1![DN]
            .Range("H" & counter_).Value = rst1![Länge]
            .Range("I" & counter_).Value = rst1![PN]
            .Range("J" & counter_).Value = rst1![PS]
            .Range("K" & counter_).Value = rst1![EL-Art]
            .Range("L" & counter_).Value = rst1![AS 1 & 2]
            .Range("M" & counter_).Value = rst1![Sicht-Ergebnis]
            .Range("N" & counter_).Value = rst1![EL-Ergebnis]
            .Range("O" & counter_).Value = rst1![Druck-Ergebnis]
            .Range("P" & counter_).Value = rst1![Gesamtergebnis]
            .Range("Q" & counter_).Value = rst1![Prüfer (Befähigte Person)]
            .Range("R" & counter_).Value = rst1![Prüfintervall]
            .Range("S" & counter_).Value = rst1![Bemerkung]
            .Range("T" & counter_).Value = rst1![Farbcodierung]

            counter_ = counter_ + 1
            rst1.MoveNext
        Next idx
    End With

    counter_ = 6 'reset

    With sht2
        For idx = 1 To rst2.RecordCount

            'Write data for selected vehicle to cells of worksheet
            .Range("A" & counter_).Value = rst2![Ansprechpartner]
            .Range("B" & counter_).Value = rst2![Rala SL-Nr]
            .Range("C" & counter_).Value = rst2![Einsatzort]
            .Range("D" & counter_).Value = rst2![Knd SL-Nr]
            .Range("E" & counter_).Value = rst2![Hersteller/Schlauchtyp]
            .Range("F" & counter_).Value = rst2![Alter]
            .Range("G" & counter_).Value = rst2![DN]
            .Range("H" & counter_).Value = rst2![Länge]
            .Range("I" & counter_).Value = rst2![PN]
            .Range("J" & counter_).Value = rst2![PS]
            .Range("K" & counter_).Value = rst2![EL-Art]
            .Range("L" & counter_).Value = rst2![AS 1 & 2]
            .Range("M" & counter_).Value = rst2![Sicht-Ergebnis]
            .Range("N" & counter_).Value = rst2![EL-Ergebnis]
            .Range("O" & counter_).Value = rst2![Druck-Ergebnis]
            .Range("P" & counter_).Value = rst2![Gesamtergebnis]
            .Range("Q" & counter_).Value = rst2![Prüfer (Befähigte Person)]
            .Range("R" & counter_).Value = rst2![Prüfintervall]
            .Range("S" & counter_).Value = rst2![Bemerkung]
            .Range("T" & counter_).Value = rst2![Farbcodierung]

            counter_ = counter_ + 1
            rst2.MoveNext
        Next idx
    End With

    counter_ = 6 'reset

    With sht3
        For idx = 1 To rst3.RecordCount

            'Write data for selected vehicle to cells of worksheet
            .Range("A" & counter_).Value = rst3![Ansprechpartner]
            .Range("B" & counter_).Value = rst3![Rala SL-Nr]
            .Range("C" & counter_).Value = rst3![Einsatzort]
            .Range("D" & counter_).Value = rst3![Knd SL-Nr]
            .Range("E" & counter_).Value = rst3![Hersteller/Schlauchtyp]
            .Range("F" & counter_).Value = rst3![Alter]
            .Range("G" & counter_).Value = rst3![DN]
            .Range("H" & counter_).Value = rst3![Länge]
            .Range("I" & counter_).Value = rst3![PN]
            .Range("J" & counter_).Value = rst3![PS]
            .Range("K" & counter_).Value = rst3![EL-Art]
            .Range("L" & counter_).Value = rst3![AS 1 & 2]
            .Range("M" & counter_).Value = rst3![Sicht-Ergebnis]
            .Range("N" & counter_).Value = rst3![EL-Ergebnis]
            .Range("O" & counter_).Value = rst3![Druck-Ergebnis]
            .Range("P" & counter_).Value = rst3![Gesamtergebnis]
            .Range("Q" & counter_).Value = rst3![Prüfer (Befähigte Person)]
            .Range("R" & counter_).Value = rst3![Prüfintervall]
            .Range("S" & counter_).Value = rst3![Bemerkung]
            .Range("T" & counter_).Value = rst3![Farbcodierung]

            counter_ = counter_ + 1
            rst3.MoveNext
        Next idx
    End With


Leave:
    On Error Resume Next
        rst1.Close
    Set rst1 = Nothing
        rst2.Close
    Set rst2 = Nothing
        rst3.Close
    Set rst3 = Nothing
    Set sht1 = Nothing
    Set sht2 = Nothing
    Set sht3 = Nothing

    If errFlag Then
        appExcel.Close SaveChanges:=False
        appExcel.Quit
    End If

    Set wkb = Nothing
    Set appExcel = Nothing

    On Error GoTo 0
Exit Sub

ErrProc:
    MsgBox Err.Description, vbCritical
    errFlag = True
    Resume Leave
End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM