2016-04-05 11 views
0

So habe ich es geschafft, eine Vorlage zu verwenden, um mehrere Excel-Dateien zu erstellen, die als .xlsx-Datei gespeichert werden, um den Makro, um sicherzustellen, wird nicht als Teil der neu erstellten Dateien gespeichert. Allerdings, habe ich jetzt das Problem der Datenbankverbindungen, die in Makro aktualisiert werden. Wenn ich diese lösche, werden bei den folgenden Dateien die Daten aus der ursprünglichen Datei erstellt, wenn die Verbindungszeichenfolgen unterbrochen wurden. Es scheint, dass dieser Prozess so funktioniert, dass die nächste Datei aus der vorherigen, nicht aus der Vorlage erstellt wird - eine Art Bucket-Brigade-Ansatz. Jetzt weiß ich, dass die Leute mich fragen werden, was ich versucht habe, aber es hat ein paar Wochen gedauert, bis ich die Chance bekommen habe, an diesen Punkt zu kommen, und ich komme nicht weiter. Bitte Jungs, ich habe gegoogelt und alles ausprobiert, aber es ist jenseits von mir. Bitte können Sie helfen? Ich habe in meinen Code den Teil eingefügt, der die Verbindungen löscht - aber wie gesagt, dies ist nicht der richtige Ansatz, wie es scheint. DankeLöschen Datenbankverbindung in Excel-VBA-Makro

Sub Button3_Click() 

Dim MyCell As Range, MyRange As Range 


Dim LR As Long 

If Dir("P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\", vbDirectory) = "" Then 
    MkDir Path:="P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\" 

End If 

If Dir("P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\Trust Code Files\", vbDirectory) = "" Then 
    MkDir Path:="P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\Trust Code Files\" 

End If 

LR = Range("A" & Rows.Count).End(xlUp).Row 


'this gets the values for workbook names 
Set MyRange = Range("A2:A" & LR).SpecialCells(xlCellTypeVisible) 
Dim xConnect As Object 

For Each MyCell In MyRange 


    'this populates a cell with the name in the range that the workbook then references for refreshing an MS query 
    Worksheets("Front Sheet").Cells(5, 5) = MyCell.Value 
    Worksheets("Front Sheet").Cells(5, 6) = MyCell.Offset(, 1).Value 
    Worksheets("Front Sheet").Cells(5, 7) = MyCell.Offset(, 2).Value 
    Worksheets("Front Sheet").Cells(5, 8) = MyCell.Offset(, 3).Value 
    Worksheets("Front Sheet").Cells(5, 9) = MyCell.Offset(, 4).Value 

     Application.DisplayAlerts = False 
     ActiveWorkbook.RefreshAll 


     ActiveWorkbook.Sheets("Speciality Score Card").Range("B7:D16").Interior.Color = RGB(251, 222, 5) 'light yellow 
     ActiveWorkbook.Sheets("Speciality Score Card").Range("B6:D6").Interior.Color = RGB(255, 192, 0) ' dark yellow 

     ActiveWorkbook.Sheets("Speciality Score Card").Range("E6:E6").Interior.Color = RGB(231, 25, 25) 'dark red 
     ActiveWorkbook.Sheets("Speciality Score Card").Range("E7:G16").Interior.Color = RGB(255, 0, 0) 'light red 

     ActiveWorkbook.Sheets("Speciality Score Card").Range("B17:D17").Interior.Color = RGB(0, 102, 0) 'dark green 
     ActiveWorkbook.Sheets("Speciality Score Card").Range("B18:D32").Interior.Color = RGB(0, 176, 80) 'light green 


     ActiveWorkbook.Sheets("Speciality Score Card").Range("E18:G32").Interior.Color = RGB(0, 88, 154) 'light blue 
     ActiveWorkbook.Sheets("Speciality Score Card").PivotTables("PivotTable3").DataBodyRange.Interior.Color = RGB(0, 88, 154) 'light blue 
     ActiveWorkbook.Sheets("Speciality Score Card").PivotTables("PivotTable3").RowRange.Interior.Color = RGB(0, 88, 154) 'light blue 
     ActiveWorkbook.Sheets("Speciality Score Card").Range("E17:G17").Interior.Color = RGB(0, 32, 96) 'dark blue 
'  ActiveWorkbook.Sheets("Overview Score Card").Range("C1").Copy 
'  ActiveWorkbook.Sheets("Overview Score Card").Range("C1").PasteSpecial (xlPasteValues) 

     ActiveWorkbook.Saved = True 
     ActiveWorkbook.Sheets("Members").Visible = False 
     ActiveWorkbook.Sheets("Front Sheet").Visible = False 
     Worksheets("Graphs Red Zone").PageSetup.CenterFooter = Worksheets("Overview Score Card").Range("A4:F4").Value 
     Worksheets("Graphs Blue Zone").PageSetup.CenterFooter = Worksheets("Overview Score Card").Range("A4:F4").Value 
     Worksheets("Graphs Yellow Zone").PageSetup.CenterFooter = Worksheets("Overview Score Card").Range("A4:F4").Value 
     Worksheets("Graphs Green Zone").PageSetup.CenterFooter = Worksheets("Overview Score Card").Range("A4:F4").Value 

     ActiveWorkbook.SaveAs Filename:="P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\" & "CNST - " & MyCell.Value & " " & Format(Now(), "dd-mmm-yyyy") & ".xlsx", FileFormat:=xlOpenXMLWorkbook 
     ActiveWorkbook.SaveAs Filename:="P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\Trust Code Files\" & MyCell.Offset(, 5).Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook 
      Dim wkb As Workbook 
     Set wkb = Workbooks.Open(Filename:="P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\" & "CNST - " & MyCell.Value & " " & Format(Now(), "dd-mmm-yyyy") & ".xlsx") 
     Dim wkb2 As Workbook 
     Set wkb2 = Workbooks.Open(Filename:="P:\Informatics\S&L scorecards\02 Clinical Scorecards\" & Format(Now(), "yyyy") & "\Trust Code Files\" & MyCell.Offset(, 5).Value & ".xlsx") 



    Application.DisplayAlerts = True 
    Next MyCell 
     ' this deletes connections 
    For Each xConnect In wkb.Connections 
       If xConnect.Name <> "ThisWorkbookDataModel" Then xConnect.Delete 
     Next xConnect 
     For Each xConnect In wkb2.Connections 
       If xConnect.Name <> "ThisWorkbookDataModel" Then xConnect.Delete 
     Next xConnect 


     ActiveWorkbook.Close 

End Sub 
+0

Beachten Sie, dass jede cell_ _For In 'MyRange' Sie öffnen' wkb' und 'wkb2'. Das scheint falsch zu sein. Und Sie speichern die Arbeitsmappe nach dem Formatieren jeder Zelle. –

+0

"_die nächste Datei wird aus der vorherigen erstellt, nicht aus der Vorlage_" Ja, das ist, weil Sie Ihre aktive Arbeitsmappe weiter verwenden. –

+0

@Paul Hi Paul - danke für die Klärung, warum es das tut - wie würde ich es dann jedes Mal zur Vorlage zurückkehren lassen? – AJCT

Antwort

1

denke ich folgendes Ihr Problem sove wird. Siehe auch die Kommentare zu Ihrer Frage.

Die Subroutine Button3_clieck() sind in dem aktuellen Arbeitsbuch. Diese Arbeitsmappe enthält außerdem die Zellen mit Informationen zum Erstellen der anderen Arbeitsmappen.

Sie haben eine separate Arbeitsmappe mit den Blättern, die Sie als Vorlage verwenden (erstellen Sie es von Ihrer aktuellen Arbeitsmappe mit dem Makro). Es wird in der while-Schleife für jede Zelle geöffnet:

Set wkbTemplate = Workbooks.Open(filename:="MyTemplate.xlsm") 

Nachdem Sie die Blätter formatiert, können Sie es unter Ihrem Namen speichern und schließen Sie es dann. Sie werden es in der nächsten Iteration der while-Schleife erneut öffnen.

nach dem zwei Arbeitsmappen zu speichern, Sie wieder öffnen sie wieder die Verbindung zu entfernen. Dann schließt du sie.

Jetzt bearbeiten Sie die nächste Zelle.

die folgenden (Pseudo-) Code veranschaulicht dies. Ich konnte den Code nicht überprüfen, daher können Fehler auftreten.

Sub Button3_Click() 

    Dim MyCell As Range, MyRange As Range 
    Dim LR As Long 
    Dim xConnect As Object 
    Dim wkb As Workbook 
    Dim wkbTemplate As Workbook  ' this is the opened template 
    Dim wkbThis As Workbook   ' this is a reference to this workbook 

    Dim basepath 
    basepath = "P:\Informatics\S&L scorecards\02 Clinical Scorecards\" 

    If Dir(basepath & Format(Now(), "yyyy") & "\", vbDirectory) = "" Then 
     MkDir Path:=basepath & Format(Now(), "yyyy") & "\" 
    End If 

    If Dir(basepath & Format(Now(), "yyyy") & "\Trust Code Files\", vbDirectory) = "" Then 
     MkDir Path:=basepath & Format(Now(), "yyyy") & "\Trust Code Files\" 
    End If 

    Set wkbThis = ActiveWorkbook ' to prevent any confusion, we use abolute workbook references 
    LR = wkbThis.ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 

    'this gets the values for workbook names 
    Set MyRange = wkbThis.ActiveSheet.Range("A2:A" & LR).SpecialCells(xlCellTypeVisible) 

    For Each MyCell In MyRange 

     Set wkbTemplate = Workbooks.Open(filename:="MyTemplate.xlsm") ' re-open the template for each cell 

     'this populates a cell with the name in the range that the workbook then references for refreshing an MS query 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 5) = MyCell.Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 6) = MyCell.Offset(, 1).Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 7) = MyCell.Offset(, 2).Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 8) = MyCell.Offset(, 3).Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 9) = MyCell.Offset(, 4).Value 

     Application.DisplayAlerts = False 
     wkbTemplate.RefreshAll 


     wkbTemplate.Sheets("Speciality Score Card").Range("B7:D16").Interior.Color = RGB(251, 222, 5) 'light yellow 
     wkbTemplate.Sheets("Speciality Score Card").Range("B6:D6").Interior.Color = RGB(255, 192, 0) ' dark yellow 

     wkbTemplate.Sheets("Speciality Score Card").Range("E6:E6").Interior.Color = RGB(231, 25, 25) 'dark red 
     wkbTemplate.Sheets("Speciality Score Card").Range("E7:G16").Interior.Color = RGB(255, 0, 0) 'light red 

     wkbTemplate.Sheets("Speciality Score Card").Range("B17:D17").Interior.Color = RGB(0, 102, 0) 'dark green 
     wkbTemplate.Sheets("Speciality Score Card").Range("B18:D32").Interior.Color = RGB(0, 176, 80) 'light green 

     wkbTemplate.Sheets("Speciality Score Card").Range("E18:G32").Interior.Color = RGB(0, 88, 154) 'light blue 
     wkbTemplate.Sheets("Speciality Score Card").PivotTables("PivotTable3").DataBodyRange.Interior.Color = RGB(0, 88, 154) 'light blue 
     wkbTemplate.Sheets("Speciality Score Card").PivotTables("PivotTable3").RowRange.Interior.Color = RGB(0, 88, 154) 'light blue 
     wkbTemplate.Sheets("Speciality Score Card").Range("E17:G17").Interior.Color = RGB(0, 32, 96) 'dark blue 
'  wkbTemplate.Sheets("Overview Score Card").Range("C1").Copy 
'  wkbTemplate.Sheets("Overview Score Card").Range("C1").PasteSpecial (xlPasteValues) 

     wkbTemplate.Saved = True 
     wkbTemplate.Sheets("Members").Visible = False 
     wkbTemplate.Sheets("Front Sheet").Visible = False 
     wkbTemplate.Worksheets("Graphs Red Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 
     wkbTemplate.Worksheets("Graphs Blue Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 
     wkbTemplate.Worksheets("Graphs Yellow Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 
     wkbTemplate.Worksheets("Graphs Green Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 

     wkbTemplate.SaveAs filename:=basepath & Format(Now(), "yyyy") & "\" & "CNST - " & MyCell.Value & " " & Format(Now(), "dd-mmm-yyyy") & ".xlsx", FileFormat:=xlOpenXMLWorkbook 
     wkbTemplate.SaveAs filename:=basepath & Format(Now(), "yyyy") & "\Trust Code Files\" & MyCell.Offset(, 5).Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook 
     wkbTemplate.Close SaveChanges:=False 

     ' this deletes connections 
     Set wkb = Workbooks.Open(filename:=basepath & Format(Now(), "yyyy") & "\" & "CNST - " & MyCell.Value & " " & Format(Now(), "dd-mmm-yyyy") & ".xlsx") 
     For Each xConnect In wkb.Connections 
      If xConnect.Name <> "ThisWorkbookDataModel" Then xConnect.Delete 
     Next xConnect 
     wkb.Close 

     Set wkb = Workbooks.Open(filename:=basepath & Format(Now(), "yyyy") & "\Trust Code Files\" & MyCell.Offset(, 5).Value & ".xlsx") 
     For Each xConnect In wkb.Connections 
      If xConnect.Name <> "ThisWorkbookDataModel" Then xConnect.Delete 
     Next xConnect 
     wkb.Close 

     Application.DisplayAlerts = True 
    Next MyCell 

    'ActiveWorkbook.Close 

End Sub 
+0

Ah! Danke Sir-Brilliant das funktioniert ein absoluter Genuss! Die einzige Änderung, die ich gemacht habe, war, wo der Code ist, um die Verbindungen unten zu löschen: – AJCT

0
Sub Button3_Click() 

    Dim MyCell As Range, MyRange As Range 
    Dim LR As Long 
    Dim xConnect As Object 
    Dim wkb As Workbook 
    Dim wkbTemplate As Workbook  ' this is the opened template 
    Dim wkbThis As Workbook   ' this is a reference to this workbook 

    Application.ScreenUpdating = False 

    Dim basepath 
    basepath = "P:\Informatics\S&L scorecards\02 Clinical Scorecards\" 
    Dim TempPath 
    TempPath = "P:\Informatics\S&L scorecards\01 Scorecard Template\01 Clinical\" 

    If Dir(basepath & Format(Now(), "yyyy") & "\", vbDirectory) = "" Then 
     MkDir Path:=basepath & Format(Now(), "yyyy") & "\" 
    End If 

    If Dir(basepath & Format(Now(), "yyyy") & "\Trust Code Files\", vbDirectory) = "" Then 
     MkDir Path:=basepath & Format(Now(), "yyyy") & "\Trust Code Files\" 
    End If 

    Set wkbThis = ActiveWorkbook ' to prevent any confusion, we use abolute workbook references 
    LR = wkbThis.ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 

    'this gets the values for workbook names 
    Set MyRange = wkbThis.ActiveSheet.Range("A2:A" & LR).SpecialCells(xlCellTypeVisible) 

    For Each MyCell In MyRange 

     Set wkbTemplate = Workbooks.Open(Filename:=TempPath & "MyTemplate.xlsm") ' re-open the template for each cell 

     'this populates a cell with the name in the range that the workbook then references for refreshing an MS query 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 5) = MyCell.Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 6) = MyCell.Offset(, 1).Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 7) = MyCell.Offset(, 2).Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 8) = MyCell.Offset(, 3).Value 
     wkbTemplate.Worksheets("Front Sheet").Cells(5, 9) = MyCell.Offset(, 4).Value 

     Application.DisplayAlerts = False 
     wkbTemplate.RefreshAll 


     wkbTemplate.Sheets("Speciality Score Card").Range("B7:D16").Interior.Color = RGB(251, 222, 5) 'light yellow 
     wkbTemplate.Sheets("Speciality Score Card").Range("B6:D6").Interior.Color = RGB(255, 192, 0) ' dark yellow 

     wkbTemplate.Sheets("Speciality Score Card").Range("E6:E6").Interior.Color = RGB(231, 25, 25) 'dark red 
     wkbTemplate.Sheets("Speciality Score Card").Range("E7:G16").Interior.Color = RGB(255, 0, 0) 'light red 

     wkbTemplate.Sheets("Speciality Score Card").Range("B17:D17").Interior.Color = RGB(0, 102, 0) 'dark green 
     wkbTemplate.Sheets("Speciality Score Card").Range("B18:D32").Interior.Color = RGB(0, 176, 80) 'light green 

     wkbTemplate.Sheets("Speciality Score Card").Range("E18:G32").Interior.Color = RGB(0, 88, 154) 'light blue 
     wkbTemplate.Sheets("Speciality Score Card").PivotTables("PivotTable3").DataBodyRange.Interior.Color = RGB(0, 88, 154) 'light blue 
     wkbTemplate.Sheets("Speciality Score Card").PivotTables("PivotTable3").RowRange.Interior.Color = RGB(0, 88, 154) 'light blue 
     wkbTemplate.Sheets("Speciality Score Card").Range("E17:G17").Interior.Color = RGB(0, 32, 96) 'dark blue 
'  wkbTemplate.Sheets("Overview Score Card").Range("C1").Copy 
'  wkbTemplate.Sheets("Overview Score Card").Range("C1").PasteSpecial (xlPasteValues) 

     wkbTemplate.Saved = True 
     wkbTemplate.Sheets("Members").Visible = False 
     wkbTemplate.Sheets("Front Sheet").Visible = False 
     wkbTemplate.Worksheets("Graphs Red Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 
     wkbTemplate.Worksheets("Graphs Blue Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 
     wkbTemplate.Worksheets("Graphs Yellow Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 
     wkbTemplate.Worksheets("Graphs Green Zone").PageSetup.CenterFooter = wkbTemplate.Worksheets("Overview Score Card").Range("A4:F4").Value 

     ' this deletes connections 
     For Each xConnect In wkbTemplate.Connections 
      If xConnect.Name <> "ThisWorkbookDataModel" Then xConnect.Delete 
     Next xConnect 




     wkbTemplate.SaveAs Filename:=basepath & Format(Now(), "yyyy") & "\" & "CNST - " & MyCell.Value & " " & Format(Now(), "dd-mmm-yyyy") & ".xlsx", FileFormat:=xlOpenXMLWorkbook 
     wkbTemplate.SaveAs Filename:=basepath & Format(Now(), "yyyy") & "\Trust Code Files\" & MyCell.Offset(, 5).Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook 
     wkbTemplate.Close SaveChanges:=False 



     Application.DisplayAlerts = True 
    Next MyCell 

    'ActiveWorkbook.Close 
    Application.ScreenUpdating = True 

End Sub 
+0

Ja, das ist ein besserer Ort, um die Verbindungen zu entfernen. –