1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Inhalt der Zelle einer Variablen zuweisen

Dieses Thema im Forum "Visual Basic 6.0, VBA & VBScript" wurde erstellt von magellan45, 17. Februar 2017.

  1. magellan45

    magellan45 Mitglied

    Guten Tag, ich bin ein VBA-Anfänger und habe folgendes Problem:
    Funktion "Copy und Paste" aus einem beliebigen Bereich in ein beliebiges Bereich zu kopieren, solange bis dieser Vorgang mit der "Esc" Taste abgebrochen wird. Nun habe ich ein Problem mit der Zuweisung der Variablen.
    Leider weiss ich noch nicht wie ich hier mein VBA-Skript hinzufügen soll.
    Kann mir dies jemand zeigen?
     
  2. Yaslaw

    Yaslaw n/a Moderator

    Genau, lass mal dein Code sehen. Dann können wir besser sehen, was du mit C&P im VBA machst.

    [Code=VB]dein VBA-Code[/code]
     
  3. magellan45

    magellan45 Mitglied

    Code (Visual Basic):
    1. Dim InhVar As String
    2. Dim AVariable As String
    3. Dim BVariable As String
    4. Dim zielVariable As String
    5. Dim ABVariable As String
    6. 'Aufgabe:Beim Klick auf eine Zelle im Bereich A1 bis B43 z.B. "A3"
    7. 'soll der Inhalt der Zellen A3+B3 nach beliebige Zelle im Bereich I11 bis J33 kopiert werden
    8. 'solange bis die "Esc" Taste betätigt wird
    9.  
    10.  
    11. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    12. 'Target.Interior.ColorIndex = 6
    13. If Not Intersect(Target, Range("A1:B43")) Is Nothing Then
    14.     Target = UCase(Target)
    15.     AVariable = Target.Address(0, 0)
    16.     'MsgBox "Du hast gerade die Zelle " & AVariable & " angeklickt"
    17.    'Hier wird die Zellen-Adresse angezeigt
    18.  
    19. InhVar = ActiveSheet.Range("A1").Value
    20. 'Hier wird der Inhalt der Zelle A1 angezeigt
    21.  
    22.  
    23.     MsgBox "Das ist der Inhalt " & InhVar
    24.  
    25.     Target.Interior.ColorIndex = 2
    26. End If
    27. If Not Intersect(Target, Range("I11:J33")) Is Nothing Then
    28.     Target = UCase(Target)
    29.     zielVariable = Target.Address(0, 0)
    30.     ABVariable = AVariable & BVariable
    31.  
    32.     'Target.Interior.ColorIndex = 2
    33. End If
    34. End Sub
     
    Zuletzt von einem Moderator bearbeitet: 17. Februar 2017
  4. Yaslaw

    Yaslaw n/a Moderator

    Aha, wir reden also von Excel. Schön. Und was ist jetzt das Problem.
    Diese Aussage ist etwa so aussagekräftig wie "Ich habe Probleme mit meinen Schuhen", Das reicht von "Sie wurden geklaut" über "sie sind zu klein" bis zu "Der Schuhbändel ist kaputt"

    Kommt eine Fehlermeldung? Wenn ja, bitte diese hier posten und schreiben wo im Code das auftaucht.
     
  5. magellan45

    magellan45 Mitglied

    Mein Problem ist, in der Zeile 19 d.h. der Inhalt der "inhVar" wechselt immer wieder je nach Klick aufweine Zelle in angegebene Bereich, In diesem Beispiel ist es "A1" beim nächsten Klick z.B. "B14" usw. Oben habe ich die Aufgabe kommentiert. Einfacher gesagt, Klick auf eine Zelle im Bereich A1 bis B43, kopiere den Inhalt von Ax und Bx nach Klick auf eine Zelle im Bereich I11 bis J33.
     
  6. Yaslaw

    Yaslaw n/a Moderator

    öhm. Natürlcih gibt er dir dort immer den Inhalt von A1 aus. Du liest ja uch den Wert von A1 explizit aus
    Code (Visual Basic):
    1. InhVar = ActiveSheet.Range("A1").Value
    2. 'Hier wird der Inhalt der Zelle A1 angezeigt
    ich verstehe noch nicht. Soll dort der Inhalt des angeklickten Feldes kommen? In der beschreibung schreibst du was, es soll weitergehen bis man Esc. drückt.Bedeutet das, dassein Feld nach dem Anderen bearbeitet werden soll? Wenn ja, zuerst horizontal oder vertikal?

    Nachher irgnedwo in einen Bereich kopieren. Soll das ausgewürfelt werden, wo in demn Bereich? Oder gibt es da eine Logik?
     
  7. Yaslaw

    Yaslaw n/a Moderator

    Ich habe mir jetzt mal unabhängig von deiner Lösung un den Problemen einfach mal die Aufgabenstellung angeschaut und umgesetzt.
    Code (Visual Basic):
    1. 'Aufgabe:Beim Klick auf eine Zelle im Bereich A1 bis B43 z.B. "A3"
    2. 'soll der Inhalt der Zellen A3+B3 nach beliebige Zelle im Bereich I11 bis J33 kopiert werden
    3. 'solange bis die "Esc" Taste betätigt wird
    4.  
    5. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    6.     Dim rowDelta As Integer
    7.    
    8.     'Nur reagieren wenn wir im Range A1-B43 sind. Ansonste hier die Methode verlassen
    9.    If Target.Row > 43 Or Target.Column > 2 Then Exit Sub
    10.  
    11.     'Diese Schleife ausführen, bis man Cancel klickt oder Exc drückt.
    12.    Do While MsgBox("Kopiere den Wert", vbQuestion + vbOKCancel) = vbOK
    13.         'Zur Auswahl: 23 Zeilen
    14.        'Versatz zu I11 auswürfeln
    15.        rowDelta = Int(Rnd * 23)
    16.         'Ausgewürfeltes Feld abfüllen. Als Qelle den Wert auf der ausgewählten Zeile
    17.        Range("I11").Offset(rowDelta) = Cells(Target.Row, 1)
    18.         Range("J11").Offset(rowDelta) = Cells(Target.Row, 2)
    19.     Loop
    20.    
    21. End Sub
     
  8. magellan45

    magellan45 Mitglied

    Ja, der Inhalt des angeklickten Feldes soll kommen. Ich habe die Variable inhVar falsch definiert. Die "AVariable" ist die Adresse der angeklickten Zelle, inhVar ist der Inhalt der AVariablen. Wie soll ich die "inhVar " definieren, wenn der (Range(xy) bei jedem Klick wechselt?
    Die "Do" Anweisung habe ich hier noch nicht implementiert. Das mache ich später.
     
  9. Yaslaw

    Yaslaw n/a Moderator

    Schwer zu sagen. Ich habe deine Konstrukt-Idee noch nicht verstanden und der Variablennamen inhVar sagt mir nicht, was drin sein soll. Deine Code-Komentare sind nicht aussagekräftig.

    Aber schau doch mal meine Umsetzung an.
     
  10. magellan45

    magellan45 Mitglied

    Super! Dein Beispiel funktioniert, nur das Resultat möchte ich selber per Klick im Bereich I11 bis J33 platzieren.
     
  11. Yaslaw

    Yaslaw n/a Moderator

    Das ist ja nicht mehr schwer hinzukriegen...
    Anderseits.... der Code muss stehen bleiben bis zum nächsten Klick. Lassmich mal kurz was probieren
     
  12. Yaslaw

    Yaslaw n/a Moderator

    So müsste es gehen. Ist eigentlich keine Hexerei
    Code (Visual Basic):
    1. Option Explicit
    2.  
    3. Dim flagInProcess As Boolean    'Flag, ob wir gerade imProzess sind
    4. Dim srcRng As Range             'Quellrange
    5.  
    6. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    7.    Dim rowDelta As Integer
    8.  
    9.     'Nur ausführen, wenn wir gerade nicht im Copy-Process sind
    10.    If Not flagInProcess Then
    11.         'Nur reagieren wenn wir im Range A1-B43 sind. Ansonste hier die Methode verlassen
    12.        If Target.Row > 43 Or Target.Column > 2 Then Exit Sub
    13.         'Markeiren, dass wir im C&P Modus sind
    14.        flagInProcess = True
    15.         'Quellrange auslesen
    16.        Set srcRng = Range(Cells(Target.Row, 1), Cells(Target.Row, 2))
    17.         MsgBox "Ausgewählte Werte: " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    18.     'Ausführen, wenn wir im
    19.  
    20.     'Wir sind am Kopieren aber ausserhalb des Zielbereiches
    21.    ElseIf Intersect(Range("I11:J33"), Target) Is Nothing Then
    22.         'Nachfragen um abzubrechen
    23.        flagInProcess = MsgBox("Feld ist nicht im Zielbereich. Weiter kopieren?", vbCritical + vbOKCancel) = vbOK
    24.  
    25.     'Target im Ziel
    26.    Else
    27.         'Werte Kopieren
    28.        srcRng.Copy Range("I" & Target.Row & ":J" & Target.Row)
    29.         'Nachfragen ob weiter kopiert werden soll
    30.        flagInProcess = MsgBox("Kopiere den Wert nochmals?", vbQuestion + vbOKCancel) = vbOK
    31.         'Falls fertig, sauber aufräumen
    32.        If Not flagInProcess Then Set srcRng = Nothing
    33.     End If
    34.    
    35. End Sub
     
  13. magellan45

    magellan45 Mitglied

    Schön! Könnte man den Range von A1-B43 mit C1-D43 und E1-F43 erweitern ? Das wäre Super!
    Es sind die letzen 20% von meinem Projekt die ich ohne Hilfe nicht geschafft hätte!
     
  14. Yaslaw

    Yaslaw n/a Moderator

    Jetzt ist der Moment zu lernen. Eine gute Sache, das selber zu erweitern. Ich beantworte gerne Fragen. Aber die Lösung musst du selber finden.
     
  15. magellan45

    magellan45 Mitglied

    Ja, ich versuche es! Ich probiere es zu vereinfachen, weil es hat viel zu viele MsgBoxen. Ich muss mich nicht auf die Copy-Bereiche beschränken, die sin sowieso ausgefüllt und wenn man außerhalb des Copy-Bereichs klickt, wird eine leere Zelle kopiert. Langsam verstehe ich die Befehle, und Ich hoffe das ich ein Erfolg haben werde.
     
  16. magellan45

    magellan45 Mitglied

    Nun habe ich den VBA-Code nach meinem Gusto angepasst. Was mir fehlt, ist die Copy-Bedingung für die Spalten I und J.
    Ist da noch was zu machen?
    Viele Dank!

    Option Explicit

    Dim flagInProcess As Boolean 'Flag, ob wir gerade imProzess sind
    Dim srcRng As Range 'Quellrange

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not flagInProcess Then
    flagInProcess = True
    If Target.Column = 1 Or Target.Column = 2 Then
    Set srcRng = Range(Cells(Target.Row, 1), Cells(Target.Row, 2))
    MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    End If
    If Target.Column = 3 Or Target.Column = 4 Then
    Set srcRng = Range(Cells(Target.Row, 3), Cells(Target.Row, 4))
    MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    End If
    If Target.Column = 5 Or Target.Column = 6 Then
    Set srcRng = Range(Cells(Target.Row, 5), Cells(Target.Row, 6))
    MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    End If
    ElseIf Intersect(Range("G11:J33"), Target) Is Nothing Then
    flagInProcess = MsgBox("Eingabe beenden?", vbCritical + vbOKCancel) = vbOK
    'Dies ist der Copy-Bereich für Spalte G und H
    Else: srcRng.Copy Range("G" & Target.Row & ":H" & Target.Row)
    '
    If Not flagInProcess Then Set srcRng = Nothing
    flagInProcess = False
    End If
    End Sub
     
  17. Yaslaw

    Yaslaw n/a Moderator

    Bitte den Code in Code-Tags setzen. So ist er unlesbar.
     
  18. magellan45

    magellan45 Mitglied

    Option Explicit

    Dim flagInProcess As Boolean 'Flag, ob wir gerade imProzess sind
    Dim srcRng As Range 'Quellrange

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not flagInProcess Then
    flagInProcess = True
    If Target.Column = 1 Or Target.Column = 2 Then
    Set srcRng = Range(Cells(Target.Row, 1), Cells(Target.Row, 2))
    MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    End If
    If Target.Column = 3 Or Target.Column = 4 Then
    Set srcRng = Range(Cells(Target.Row, 3), Cells(Target.Row, 4))
    MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    End If
    If Target.Column = 5 Or Target.Column = 6 Then
    Set srcRng = Range(Cells(Target.Row, 5), Cells(Target.Row, 6))
    MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    End If
    ElseIf Intersect(Range("G11:J33"), Target) Is Nothing Then

    'Die folgende Zeile funktioniert nicht mehr...
    flagInProcess = MsgBox("Eingabe beenden?", vbCritical + vbOKCancel) = vbOK

    'Dies ist der Copy-Bereich für Spalte G und H
    Else: srcRng.Copy Range("G" & Target.Row & ":H" & Target.Row)
    '
    If Not flagInProcess Then Set srcRng = Nothing
    End If

    End Sub
     
    Zuletzt bearbeitet: 20. Februar 2017
  19. Yaslaw

    Yaslaw n/a Moderator

    Und wenn du nicht mehr weisst wie. Ich habe deinen 2ten Beitrag in diesem Thread damals angepasst. du kannst ihn "bearbeiten" um zu sehen wie die Tags gesetzt sind.
     
  20. magellan45

    magellan45 Mitglied

    Code (Visual Basic):
    1. Option Explicit
    2.  
    3. Dim flagInProcess As Boolean    'Flag, ob wir gerade imProzess sind
    4. Dim srcRng As Range             'Quellrange
    5.  
    6. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    7.     If Not flagInProcess Then
    8.        flagInProcess = True
    9.         If Target.Column = 1 Or Target.Column = 2 Then
    10.           Set srcRng = Range(Cells(Target.Row, 1), Cells(Target.Row, 2))
    11.           MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    12.         End If
    13.         If Target.Column = 3 Or Target.Column = 4 Then
    14.           Set srcRng = Range(Cells(Target.Row, 3), Cells(Target.Row, 4))
    15.           MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    16.          End If
    17.           If Target.Column = 5 Or Target.Column = 6 Then
    18.             Set srcRng = Range(Cells(Target.Row, 5), Cells(Target.Row, 6))
    19.             MsgBox "Ausgewähltes Lied : " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    20.           End If
    21.     ElseIf Intersect(Range("G11:J33"), Target) Is Nothing Then
    22.  
    23.     'Die folgende Zeile funktioniert nicht mehr, muss ich hier den Befehl flaginProcess = Else setzen?
    24.        flagInProcess = MsgBox("Eingabe beenden?", vbCritical + vbOKCancel) = vbOK
    25.      
    26.         'Dies ist der Copy-Bereich für Spalte G und H
    27.    Else: srcRng.Copy Range("G" & Target.Row & ":H" & Target.Row)
    28.     '
    29.       If Not flagInProcess Then Set srcRng = Nothing
    30.     End If
    31.    
    32. End Sub
     
Die Seite wird geladen...