Long-Variablen subtrahieren

  • Sonstige

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Orakel.

    Long-Variablen subtrahieren

    Hallo zusammen,

    bin ein absoluter Newbie bzgl VBA-Excel-programmierung.

    Folgendes Problem:
    Ich ermittel mir mit folgendem Code-Fragment eine Zeile:
    Zeilenzaehler = (Cells.Find(What:=Suchwert, _ After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:= xlNext, MatchCase:=True).Row)
    Soweit so gut. Im Verlauf des Makros muss ich von dieser Variablen 1 subtrahieren, solange der Wert einstellig ist, kein Problem, erst wenn in der Variablen ein 2-stelliger Wert steht und ich dann um eins subtrahiere, also 11 -1 = 10 wird bei diesem Vorgang das Ergebnis auf 1 gesetzt. Warum ? Alle benötigten Variablen sind lokale Variablen.

    Könnt Ihr mir bitte helfen?

    Gruß von Newbie

    Hans
    Hallo Hans,

    also ich hab zwar schon einiges mit EXCEL VBA erlebt, aber rechnen tut's eigentlich ganz korrekt. Ich vermute, dass das Problem an anderer Stelle zu suchen ist. Was mir auffällt:

    - Du weist der Variablen Zeilenzaehler direkt die Zeile des zurückgegebenen Range Objektes zu. Es erfolgt aber keien Prüfung, ob der Suchvorgang erfolgreich gewesen ist. Evtl. ist eine fehlgeschlage Suche der Grund.

    Ohne ein bischen mehr Code kann ich da nur wenig weiterhelfen.

    Gruß
    Das Orakel

    Long-Variablen subtrahieren

    Hallo Orakel,

    danke für Deine Antwort. Damit Du mir eventuell noch weiter helfen kannst, poste ich mal den gesamten Code dieser Function:

    Der Aufruf der Funktion sieht folgender Maßen aus:

    Call SheetData(Map, Layer, SheetNames, SH_C_Index)

    Die Funktion:
    Function SheetData(Map, Layer, SheetNames, SH_C_Index)

    Dim Suchwert As Variant
    Dim CopyIndex As String
    Dim CopyCell As String
    Dim Zeile As String
    Dim zahl As Long
    Dim Spalte As Long
    Dim Zeilenzaehler As Long
    Dim zz As Long

    Suchwert = Workbooks(Map).Worksheets(SheetNames(SH_C_Index - 1)).Cells(1, 1)
    Workbooks("produktliste.xls").Worksheets("produktliste").Activate
    Lauf_index = 1
    Zeilenindex = 1
    CopyIndex = 2
    zahl = 0
    zz = 0

    ' Do
    With Workbooks("produktliste.xls").Worksheets("produktliste").Range("a1:a4000")
    Set c = .Find(Suchwert, LookIn:=xlValues)
    If Not c Is Nothing Then
    Range("A1:A4000").Select
    firstAddress = c.Address(RowAbsolute:=False, ColumnAbsolute:=False)
    ' Range(firstAddress).Select

    Spalte = (Cells.Find(What:=Suchwert, After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=True).Row)
    Zeilenzaehler = (Cells.Find(What:=Suchwert, After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=True).Row)
    zz = Zeilenzaehler
    inhalt = VarType(Spalte)
    inhalt1 = VarType(Zeilenzaehler)
    Workbooks("produktliste.xls").Worksheets("produktliste").Rows(Spalte).Copy
    Workbooks(Map).Worksheets(SheetNames(SH_C_Index - 1)).Activate
    Range("A2").Select
    ActiveSheet.Paste
    Do
    Workbooks("produktliste.xls").Worksheets("produktliste").Activate
    If Suchwert = ActiveCell.Value Then
    c.Interior.Pattern = xlPatternGray50
    Set c = .FindNext(c)
    firstAddress = c.Address(RowAbsolute:=False, ColumnAbsolute:=False)
    Range("A1:A4000").Select
    Range(firstAddress).Select
    Spalte = (Cells.Find(What:=Suchwert, After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=True).Row)
    Zeilenzaehler = (Cells.Find(What:=Suchwert, After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=True).Row)
    zz = Zeilenzaehler
    zz = zz - 1
    inhalt1 = VarType((Cells.Find(What:=Suchwert, After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=True).Row))
    zahl = (Cells.Find(What:=Suchwert, After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=True).Row)
    Zeilenzaehler = Zeilenzaehler - 1
    zahl = zahl - 1
    rw = Spalte - 1
    Spalte = (Spalte - 1)
    Workbooks("produktliste.xls").Worksheets("produktliste").Rows(Spalte).Copy
    Workbooks(Map).Worksheets(SheetNames(SH_C_Index - 1)).Activate
    CopyIndex = CopyIndex + 1
    CopyCell = "A" & CopyIndex
    Range(CopyCell).Select
    ActiveSheet.Paste
    End If
    Loop While Suchwert = ActiveCell.Value Or ActiveCell = " "
    ' Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
    End With
    ' Loop While Suchwert = ActiveCell.Value Or ActiveCell = " "

    End Function
    Ich hoffe, Du kannst damit ein wenig mehr anfangen und mir helfen.

    Vielen Dank im voraus.

    Hans
    Uff, dass ist ja ne ganze Menge. Also wenn ich das korrekt verstehe, hast Du eine Exceldatei, in der in Zelle A1 das Produkt steht, das aus der Exceldatei "Preisliste.xls" ausgelesen werden soll. Wenn ich mir die Dateien entsprechend zurechtbastel, habe ich keinen Stress mit der Rechenoperation. Aber mir ist an zwei Stellen aufgefallen, dass Du die Spalte ausliest, aber dabei die Row Eigenschaft verwendest. Hat aber mit Deinem Prob nix zu tun.

    Ich versuch noch mal das Teil zu durchsteigen und melde mich noch mal

    Gruß
    Das Orakel
    Hallo Hans,

    also ich bin jetzt den Weg des geringeren Wiederstandes gegangen :) und dazu kann ich Dir folgende Lösung anbieten:

    Quellcode

    1. Public Sub FindData()
    2. Dim nZielZeile As Integer ' Zeile für die Ausgabe
    3. Dim oRange As Range ' Range Objekt für die Suche
    4. Dim szFirstAddress As String ' erste Fundstelle
    5. Dim szSuchwert As String ' Suchbegriff
    6. Rem ===================================================
    7. Rem == Suchwert aus aktuellem Sheet merken. Verarbei-==
    8. Rem == tungsvaribalen initialisieren. ==
    9. Rem ===================================================
    10. szSuchwert = Cells(1, 1).Value
    11. nZielZeile = 2
    12. Rem ===================================================
    13. Rem == Produktliste aktivieren. ==
    14. Rem ===================================================
    15. Workbooks("produktliste.xls").Worksheets("produktliste").Activate
    16. With Workbooks("produktliste.xls").Worksheets("produktliste").Range("A1:A4000")
    17. Set oRange = .Find(szSuchwert, Range("A1"), LookIn:=xlValues)
    18. szFirstAddress = ""
    19. Rem ===============================================
    20. Rem == Schleife um in Quelle alle Einträge zu ==
    21. Rem == suchen. ==
    22. Rem ===============================================
    23. While Not oRange Is Nothing And szFirstAddress <> oRange.Address
    24. Rem ===========================================
    25. Rem == Da dieser sch... Findbefehl loopt, ==
    26. Rem == merken wir uns die erste Fundstelle ==
    27. Rem ===========================================
    28. If szFirstAddress = "" Then
    29. szFirstAddress = oRange.Address
    30. End If
    31. Rem ===========================================
    32. Rem == Zeile der Fundstelle markieren und ==
    33. Rem == Kopiervorgang einleiten. ==
    34. Rem ===========================================
    35. Rows(oRange.Row).Select
    36. Selection.Copy
    37. Rem ===========================================
    38. Rem == Zieldatei aktivieren und Pastevorgang ==
    39. Rem ===========================================
    40. Workbooks("Mappe3.xls").Worksheets("Tabelle1").Activate
    41. Cells(nZielZeile, 1).Select
    42. ActiveSheet.Paste
    43. Application.CutCopyMode = False
    44. Rem ===========================================
    45. Rem == Und weitersuchen in Quelldatei. ==
    46. Rem ===========================================
    47. Workbooks("produktliste.xls").Worksheets("produktliste").Activate
    48. nZielZeile = nZielZeile + 1
    49. oRange.Interior.Pattern = xlPatternGray50
    50. Set oRange = .FindNext(oRange)
    51. Wend
    52. End With
    53. End Sub


    Die notwendige Parameterübergabe für die korrekte Arbeitsweise sollte ja kein Problem darstellen.

    Maybe it helps
    Das Orakel

    Long-Variablen subtrahieren

    Hallo Orakel,

    das ist genau die Lösung des Problems. Du hast auch das Loop-Problem des Find-Befehls leicht umgangen. Super, danke.

    Es läuft und macht genau das, was ich will.

    Danke für Deine Hilfe.

    Hans