2017-09-22 6 views
3

Könnten Sie mir mit diesem Problem in meinem VBA-Code helfen? (Ich habe versucht, viele Themen über 1004 Fehler in Foren zu gehen, aber ich bin ein VBA-Neuling und war nicht in der Lage, damit umzugehen ..).Excel VBA - Fehler 1004

  • wird Tabelle in RawData Blatt mit headers - ich brauche den Datenteil zu reinigen, dann in nächstem Abschnitt ich dort einige der Daten aus anderem Blatt, auf dem kopieren werde, ist Pivot-Tabelle

Fehler auf der Linie (siehe Abschnitt ‚Blatt RawData Reinigung):

RawData.Range(Cells(2, 1), Cells(LastRow, LastCol)).Delete 

Code Nicht ganz, aber hier ist ein bisschen:

'Exporting 
Dim FZ As Workbook 
Dim Cesta As Variant 
Dim i As Long 
Dim SubRegion As String 
Dim rTable As Range 
Dim CurrDate As String 
Dim RawData As Worksheet 
Dim SFDCReport As Worksheet 
Dim MS As Worksheet 
Dim DS As Worksheet 
Dim DealOffice As Worksheet 

Set DS = ThisWorkbook.Sheets("Data") 
Set MS = ThisWorkbook.Sheets("Macro") 
Cesta = Application.GetOpenFilename 
Set FZ = Workbooks.Open(Filename:=Cesta, Local:=True) 
Set RawData = FZ.Sheets("RawData") 
Set SFDCReport = FZ.Sheets("SFDC Report") 
Set DealOffice = FZ.Sheets("Coverage DealOffice") 
CurrDate = MS.Range("E1").Value 

For i = 1 To PRFilter 
    'Check if Export column is not empty for each SubRegion, if yes, skip to next Subregion(Iteration) 
    If IsEmpty(MS.Cells(i + 1, 2).Value) Then 
    GoTo NextIteration 
     Else 'Things to do if "Not Empty" 
     'SubRegion value paste into C10 so Highlights section is updated 
     SubRegion = MS.Cells(i + 1, 1).Value 
     SFDCReport.Cells(10, 3).Value = SubRegion 

    'Sheet SFDC Report Cleaning 
    With SFDCReport 
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
    LastCol = .Cells(12, .Columns.Count).End(xlToLeft).Column 
    .Range(Cells(14, 1), Cells(LastRow, LastCol)).Delete 
    End With 

    'Filter, Select & Copy filtered data to SFDCReport table 
    DS.Range("A1").CurrentRegion.AutoFilter Field:=84, Criteria1:=SubRegion 
    Set rTable = DS.AutoFilter.Range 
    Set rTable = rTable.Resize(rTable.Rows.Count - 1) 
    Set rTable = rTable.Offset(1) 'Move new range down to start at the first data row 
    rTable.Copy 
    SFDCReport.Cells(13, 1).PasteSpecial xlPasteValues 
    DealOffice.PivotTables("PivotTable1").RefreshTable 'Refresh PivotTable on DealOffice Sheet 

    'Sheet RawData Cleaning 
    LastCol = RawData.UsedRange.Columns.Count 
    LastRow = RawData.UsedRange.Rows.Count 
    RawData.Range(Cells(2, 1), Cells(LastRow, LastCol)).Delete 

    'Sheet CoverageDealOffice Pivot data copying to RawData 
    With DealOffice 
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
    LastCol = .Cells(17, .Columns.Count).End(xlToLeft).Column 
    .Range(Cells(17, 1), Cells(LastRow - 1, LastCol)).Copy 
    End With 
    RawData.Cells(2, 1).PasteSpecial xlPasteValues 

    'Formatting/other changes & Saving 
    SFDCReport.Activate 
    ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1 
    ActiveWindow.ScrollColumn = 68 
    DealOffice.Select 
    FZ.SaveAs Filename:=DirExport & "\" & CurrDate & "_NCE Deal Office Report_" & SubRegion & ".xlsb", FileFormat:=50 

NextIteration: 
    End If 
Next 

Danke Jungs, Gamca

+4

Sie * immer * sollte das Blatt angeben, wenn 'Bereich mit()' oder 'Zellen()'. I.e. 'RawData.Range (RawData.Cells (2, 1), RawData.Cells (LastRow, LastCol)). Delete' Oder in einer With-Anweisung' .Range (.Cells (14, 1), .Cells (LastRow, LastCol)) Löschen. – BruceWayne

+0

Thx Bruce, das funktionierte für diese Zeile ... es kam mir nur logisch vor, da ich RawData als Sheet in ein bestimmtes Arbeitsbuch gesetzt hatte, also dachte ich, ich würde ihm genug sagen, wo solche Range liegt ... komisch für mich Sag ihm, wo Range ist und dann auch Cells. – Gamca

+1

Ich bin mir sicher, dass es eine elegantere Erklärung gibt, aber denke immer daran, dass VBA alle Range-Objekte als Standalone behandelt. Obwohl Sie 'Worksheet(). Range()' ausgeführt haben, müssen Sie auch das Blatt angeben, wenn Sie 'Cells' oder' Columns() 'oder' Rows() '* in diesem Bereich * verwenden. – BruceWayne

Antwort

0

nicht sicher, warum dies von Original zum Ziel gesamten Datensatz hält Kopieren .. Ich brauche in Destination nur Daten gefiltert kopiert werden, das beginnt mit A13 im Zielblatt SFDCReport

'Filter, Select & Copy filtered data to SFDCReport table 
    DS.Range("A1").CurrentRegion.AutoFilter Field:=84, Criteria1:=SubRegion 
    LastRow = DS.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1 
    LastCol = DS.AutoFilter.Range.Columns.Count 
    Set rTable = DS.AutoFilter.Range 
    Set rTable = rTable.Resize(rTable.Rows.Count - 1) 
    Set rTable = rTable.Offset(1) 'Move new range down to start at the first data row 
    Set rTable2 = SFDCReport.Range(SFDCReport.Cells(13, 1), SFDCReport.Cells(LastRow, LastCol)) 
    rTable2.Value = rTable.Value 
0

Korrigiert/Gelöst - Dank einiger Ratschläge habe ich die "Syntax" -Kodierung geändert, um With/End With + zu verwenden, wobei darauf geachtet wurde, dass in allen Range-Objekten "Adresse" enthalten ist.

Teil geänderten Code:

'Filter, Select & Copy filtered data to SFDCReport table 
     With DS.Range("A1").CurrentRegion 
     .AutoFilter Field:=84, Criteria1:=SubRegion 
     .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy SFDCReport.Cells(13, 1) 
     End With 
Verwandte Themen