2017-11-28 7 views
0

Ich schreibe einen kleinen Teil des Codes, der durch Sie folgendermaßen vorgehen laufen:VBA Wort ungültig Qualifier Fehler Dynamische Verwendung Bereiche zu leeren Zellen ersetzen

  1. Finden Sie die maximale Größe des Datenblocks (was der letzte ist Zelle mit Daten in und die Koordinaten, gegeben durch LRow und LCol)
  2. Suche durch die Daten innerhalb einer Spalte (würde dies eine Reihe von Spalten machen) und wenn eine Zelle leer ist, dann verwenden Sie den Wert der Zelle über es.
  3. Erstellen Sie ein neues Blatt und benennen Sie
  4. Gehen Sie durch die Daten wählen Sie nur die Zeilen, die das Wort "Fatal" innerhalb der Spalte k haben, und fügen Sie diese Zeilen in das neue Blatt umbenannt.

Unten ist mein Code so weit. Kann jemand die oben erwähnten Verbesserungen implementieren und herausfinden, warum ich einen ungültigen Qualifier-Fehler bei LRow erhalte? Der Code wird aus einem Word-Dokument initiiert, um eine Excel-Tabelle zu öffnen und mit Daten in der Tabelle zu spielen.

Klicken Sie auf, um die globale Unter zu aktivieren:

Private Sub ObtainFatalCrashInfoButton_Click() 
'Disable screen updating 
'Application.ScreenUpdating = False 
Application.Run ("OpenRawDataFile") 
Application.Run ("FixData") 
Application.Run ("GetData") 
'Application.Run ("CloseRawDataFile") 
Application.Run ("CommandButtonRemove") 
'Enable screen updating 
'Application.ScreenUpdating = True 

End Sub 

dann die folgenden subs wiederum aktiviert werden:

Sub OpenRawDataFile() 
'Not sure this works.... 
Set appExcel = CreateObject("Excel.Application") 

Dim IFAM_Index As Variant 

Dim IFAM_File As Variant 

IFAM_File = appExcel.GetOpenFilename("Excel files (*.xls), *.xls") 

appExcel.Workbooks.Open IFAM_File 

End Sub 

Sub FixData. Fügt fehlende Daten hinzu, um den nächsten Teil des Prozesses zu vereinfachen

Sub FixData() 
Dim i As Long 
Dim LRow As Long, LCol As Long 
Dim rngD As Range 

'Set the range of the "Duration Working" Spreadsheet 
LRow = wb.Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 
LCol = wb.Worksheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Column 
Set rngD = Range(Cells(2, 1), Cells(LRow, LCol)) 


For i = 1 To LRow.Rows.Count 
    If LRow.Cells(i, 11).Value = "" Then 
     LRow.Cells(i, 11).Value = LRow.Cells(i - 1, 1).Value 
    End If 
Next 
End Sub 

Sub GetData(). SUb sollte die Zeilen, die die Kriterien erfüllen, in ein neues Blatt kopieren, um das Extrahieren in das gewünschte Format zu erleichtern (dieser Teil muss noch geschrieben werden).

Sub GetData() 

'Create new tab to copy data to 
Dim WS As Worksheet 

Set WS = Sheets.Add 

'assuming the data is in sheet1 
Sheets("Sheet2").Select 
RowCount = LRow 
For jj = 1 To RowCount 
    'assuming the true statment is in column k 
    Range("k" & jj).Select 
    check_value = ActiveCell 
    If check_value = "Fatal" Or check_value = "fatal" Then 
     ActiveCell.EntireRow.Copy 
     'assuming the data is in sheet2 
     WS.Select 
     RowCount = Cells(Cells.Rows.Count, "k").End(xlUp).Row 
     Range("k" & RowCount + 1).Select 
     ActiveSheet.Paste 
     Sheets("Sheet2").Select 
    End If 
Next 

End Sub 

Unter CopyData(). Geschrieben werden. Kopiert Daten in einem bestimmten Format in ein Wort. Irgendwelche Vorschläge irgendjemand?

Sub CopyData() 
'....To be written 
End Sub 

Unter CloseRawDataFile. Schließt die Rohdatendatei ohne Speichern, da die Daten jetzt im gewünschten Format in Word kopiert werden sollen.

Sub CloseRawDataFile() 

wb.Close SaveChanges:=False 
Set wb = Nothing 

End Sub 

Unter CommandButtonRemove. Entfernen Sie die Befehlsschaltfläche aus dem Word-Dokument, da der Prozess nicht erneut erforderlich ist.

Letztendlich durchsucht dieser Code den Datensatz und fügt den Inhalt, der ein Kriterium erfüllt, in das Word-Dokument in einer vordefinierten Tabelle ein. Ich habe versucht, kleine Komponenten des Codes zu isolieren, um es einfacher zu machen. Daher wird in diesem Stadium nur der Code gesucht und in eine neue Tabelle eingefügt.

Jede Hilfe zu den anderen noch zu schreibenden Teilen wäre auch eine große Hilfe!

+1

Eine Variable vom Typ Long hat keine Eigenschaft 'Rows'. Vielleicht willst du einfach 'For i = 1 To Lrow' –

+0

^^ Noch hat es eine' Cells' Eigenschaft. Ist 'LRow.Cells' gemeint,' wb.Worksheets ("Sheet2") zu sein. Zellen? – YowE3K

+0

^^^ oder vielleicht 'For i = 1 To LRow.Rows.Count' sollte' sein For i = 1 To rngD.Rows.Count' und 'LRow.Cells' sein sollte' rngD.Cells' – YowE3K

Antwort

0

Ich poste dies als eine mögliche Lösung für Ihre FixData Routine. Selbst wenn es nicht genau das tut, was Sie vorhaben, gibt es Ihnen vielleicht eine Vorstellung davon, was Sie tun müssen, damit der Rest Ihres Codes funktioniert.

'Force developer to declare every variable that is being used 
Option Explicit 

'Define module-level scoped variables, which will be available to all 
'procedures in this code module 
Private appExcel As Object 
Private wb As Object 
Private LRow As Long 
'Need to define all the constants that are normally available in Excel VBA 
Private Const xlUp As Long = -4162 
Private Const xlToLeft As Long = -4159 

Private Sub ObtainFatalCrashInfoButton_Click() 
    OpenRawDataFile 
    'Disable screen updating 
    appExcel.ScreenUpdating = False 
    FixData 
    'Application.Run ("GetData") 
    'Application.Run ("CloseRawDataFile") 
    'Application.Run ("CommandButtonRemove") 
    'Enable screen updating 
    appExcel.ScreenUpdating = True 
End Sub 

Sub OpenRawDataFile() 
    Set appExcel = CreateObject("Excel.Application") 

    Dim IFAM_Index As Variant 
    Dim IFAM_File As Variant 

    IFAM_File = appExcel.GetOpenFilename("Excel files (*.xls), *.xls") 

    'Create a workbook object that we can refer to 
    Set wb = appExcel.Workbooks.Open(IFAM_File) 
End Sub 

Sub FixData() 
    Dim i As Long 
    'Your question implies that you need LRow to be module-level scope 
    ' so remove declaration from here 
    'Dim LRow As Long, LCol As Long 
    Dim LCol As Long 
    '"As Range" in Word means "As Word.Range". If you are using 
    ' late-binding to access Excel, you need to declare rngD "As Object" 
    'Dim rngD As Range 
    Dim rngD As Object 

    'Set the range of the "Duration Working" Spreadsheet 
    '"Rows" and "Columns" need to be qualified, because Word doesn't know that 
    ' you really mean that to be "appExcel.ActiveWorkbook.ActiveSheet.Rows", etc, 
    ' (and you probably didn't mean that anyway) 
    'LRow = wb.Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 
    'LCol = wb.Worksheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Column 
    LRow = wb.Worksheets("Sheet2").Cells(wb.Worksheets("Sheet2").Rows.Count, 1).End(xlUp).Row 
    LCol = wb.Worksheets("Sheet2").Cells(1, wb.Worksheets("Sheet2").Columns.Count).End(xlToLeft).Column 
    '"Range" and "Cells" need to be qualified, because Word doesn't know that 
    ' you really mean that to be "appExcel.ActiveWorkbook.ActiveSheet.Range", etc, 
    ' (and you probably didn't mean that anyway) 
    'Set rngD = Range(Cells(2, 1), Cells(LRow, LCol)) 
    Set rngD = wb.Worksheets("Sheet2").Range(wb.Worksheets("Sheet2").Cells(2, 1), wb.Worksheets("Sheet2").Cells(LRow, LCol)) 

    'To save typing, the previous statements could be written as 
    'With wb.Worksheets("Sheet2") 
    ' LRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
    ' LCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 
    ' Set rngD = .Range(.Cells(2, 1), .Cells(LRow, LCol)) 
    'End With 

    'This section was probably meant to work on "rngD" 
    'For i = 1 To LRow.Rows.Count 
    ' If LRow.Cells(i, 11).Value = "" Then 
    '  LRow.Cells(i, 11).Value = LRow.Cells(i - 1, 1).Value 
    ' End If 
    'Next 
    For i = 1 To rngD.Rows.Count 
     If rngD.Cells(i, 11).Value = "" Then 
      rngD.Cells(i, 11).Value = rngD.Cells(i - 1, 1).Value 
     End If 
    Next 
End Sub