2016-06-07 8 views
0

Ich habe den folgenden Code, den ich benutze, um den Befehlstext einer Abfrage zu verbessern. Das Problem ist mit der letzten Zeile, wo ich versuche, einen Bereich zu übergeben (RepStartRng). Anstatt die Bereichsadresse zu übergeben, übergibt mein Code den Bereichswert. Bitte sehen Sie unten und danke im Voraus.Pass Bereich in Funktion

Sub UseClass() 
    Dim c As Report_ 
    Set c = New Report_ 

    Dim RepC As Long 
    Dim Repcol As String 
    Dim Counter As Long 
    Dim RepStartRng As Range 

    c.Day = FindDay() 
    Repcol = ColLetter(FindDay()) 
    RepC = CountReports(Repcol) 
    c.name = "A" 
    Debug.Print "Repcol: " & Repcol 
    Debug.Print RepC 
    c.RepCount = RepC 
    For i = 1 To c.RepCount 
     Counter = i 
     Report = Rep(Counter, ColLetter(FindDay())) 
     Set RepStartRng = Range(Repcol & "3") 
     RepStartRng.Select 
     Debug.Print RepStartRng.Address 
     UpdateQuery Report, RepStartRng, Counter 
    Next i 
End Sub 
Function UpdateQuery(Report As String, RepRng As Range, Counter As Long) 
    Dim Rng As Range 
    Set RepRng = RepRng 
    Dim Dat As String 
    Dat = QueryDates(Rng) 
    Dim cn As WorkbookConnection 
    Dim wb As Workbook 
    Dim NewWb As Workbook 
    Set wb = ActiveWorkbook 

    Dim odbcCn As ODBCConnection, oledbCn As OLEDBConnection 
    For Each cn In ThisWorkbook.Connections 
     If cn.name = Report Then 
      Set oledbCn = cn.OLEDBConnection 
      Debug.Print Dat 
      oledbCn.CommandText = Replace(oledbCn.CommandText, "?", "'" & Dat & "'") 
      Sheets(Rng.Value).Copy 
      Set NewWb = ActiveWorkbook 
      NewWb.SaveAs ("C:\Users\krishn.patel\Desktop\" & Rng.Value & ".xlsb"), FileFormat:=50 
      NewWb.Close 
      oledbCn.CommandText = Replace(oledbCn.CommandText, "'" & Dat & "'", "?") 
     End If 
    Next 
End Function 
+0

Wenn Sie einen Bereich übergeben, übergeben Sie das Bereichsobjekt, nicht die Adresse. Warum glaubst du, dass es den Wert übersteigt? Wozu dient die Zeile 'Set RepRng = RepRng'? Und warum verwenden Sie nicht den Bereich, den Sie übergeben (RepRng)? –

Antwort

0

Ohne den Inhalt des Bereichs zu kennen oder die anderen Funktionen zu sehen, die Sie (z QueryDates) nennen, ist es unmöglich zu wissen, ob dieser Code perfekt ist, aber es sollte Ihnen näher an, was Sie brauchen. Ich entfernte redundante Variablen und ändere die Funktion in einen Sub, da sie keine Werte zurückgibt.

Sub UseClass() 
    Dim c As Report_ 
    Set c = New Report_ 

    Dim RepC As Long 
    Dim Repcol As String 
    Dim Counter As Long 
    Dim RepStartRng As Range 

    c.Day = FindDay() 
    Repcol = ColLetter(FindDay()) 
    RepC = CountReports(Repcol) 
    c.name = "A" 
    Debug.Print "Repcol: " & Repcol 
    Debug.Print RepC 
    c.RepCount = RepC 
    For Counter = 1 To c.RepCount 
     Report = Rep(Counter, ColLetter(FindDay())) 
     Set RepStartRng = Range(Repcol & "3") 
     UpdateQuery Report, RepStartRng, Counter 
    Next Counter 
End Sub 
Sub UpdateQuery(Report As String, RepRng As Range, Counter As Long) 
    Dim Dat As String 
    Dat = QueryDates(RepRng) 
    Dim cn As WorkbookConnection 
    Dim NewWb As Workbook 

    Dim odbcCn As ODBCConnection, oledbCn As OLEDBConnection 
    For Each cn In ThisWorkbook.Connections 
     If cn.name = Report Then 
      Set oledbCn = cn.OLEDBConnection 
      Debug.Print Dat 
      oledbCn.CommandText = Replace(oledbCn.CommandText, "?", "'" & Dat & "'") 
      Sheets(RepRng.Value).Copy 
      Set NewWb = ActiveWorkbook 
      NewWb.SaveAs ("C:\Users\krishn.patel\Desktop\" & RepRng.Value & ".xlsb"), FileFormat:=50 
      NewWb.Close 
      oledbCn.CommandText = Replace(oledbCn.CommandText, "'" & Dat & "'", "?") 
     End If 
    Next 
End Sub