Anzeige

 Inhalt der Zelle einer Variablen zuweisen


#1
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?
 
#3
Visual Basic:
Dim InhVar As String
Dim AVariable As String
Dim BVariable As String
Dim zielVariable As String
Dim ABVariable As String
'Aufgabe:Beim Klick auf eine Zelle im Bereich A1 bis B43 z.B. "A3"
'soll der Inhalt der Zellen A3+B3 nach beliebige Zelle im Bereich I11 bis J33 kopiert werden
'solange bis die "Esc" Taste betätigt wird


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Target.Interior.ColorIndex = 6
If Not Intersect(Target, Range("A1:B43")) Is Nothing Then
    Target = UCase(Target)
    AVariable = Target.Address(0, 0)
    'MsgBox "Du hast gerade die Zelle " & AVariable & " angeklickt"
    'Hier wird die Zellen-Adresse angezeigt
 
InhVar = ActiveSheet.Range("A1").Value
'Hier wird der Inhalt der Zelle A1 angezeigt

  
    MsgBox "Das ist der Inhalt " & InhVar
  
    Target.Interior.ColorIndex = 2
End If
If Not Intersect(Target, Range("I11:J33")) Is Nothing Then
    Target = UCase(Target)
    zielVariable = Target.Address(0, 0)
    ABVariable = AVariable & BVariable
  
    'Target.Interior.ColorIndex = 2
End If
End Sub
 
Zuletzt bearbeitet von einem Moderator:

Yaslaw

n/a
Moderator
#4
Aha, wir reden also von Excel. Schön. Und was ist jetzt das Problem.
Nun habe ich ein Problem mit der Zuweisung der Variablen.
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
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.
 

Yaslaw

n/a
Moderator
#6
öhm. Natürlcih gibt er dir dort immer den Inhalt von A1 aus. Du liest ja uch den Wert von A1 explizit aus
Visual Basic:
InhVar = ActiveSheet.Range("A1").Value
'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?
 

Yaslaw

n/a
Moderator
#7
Ich habe mir jetzt mal unabhängig von deiner Lösung un den Problemen einfach mal die Aufgabenstellung angeschaut und umgesetzt.
Visual Basic:
'Aufgabe:Beim Klick auf eine Zelle im Bereich A1 bis B43 z.B. "A3"
'soll der Inhalt der Zellen A3+B3 nach beliebige Zelle im Bereich I11 bis J33 kopiert werden
'solange bis die "Esc" Taste betätigt wird

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rowDelta As Integer
   
    'Nur reagieren wenn wir im Range A1-B43 sind. Ansonste hier die Methode verlassen
    If Target.Row > 43 Or Target.Column > 2 Then Exit Sub

    'Diese Schleife ausführen, bis man Cancel klickt oder Exc drückt.
    Do While MsgBox("Kopiere den Wert", vbQuestion + vbOKCancel) = vbOK
        'Zur Auswahl: 23 Zeilen
        'Versatz zu I11 auswürfeln
        rowDelta = Int(Rnd * 23)
        'Ausgewürfeltes Feld abfüllen. Als Qelle den Wert auf der ausgewählten Zeile
        Range("I11").Offset(rowDelta) = Cells(Target.Row, 1)
        Range("J11").Offset(rowDelta) = Cells(Target.Row, 2)
    Loop
   
End Sub
 
#8
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.
 

Yaslaw

n/a
Moderator
#9
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.
 
#12
So müsste es gehen. Ist eigentlich keine Hexerei
Visual Basic:
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)
   Dim rowDelta As Integer

    'Nur ausführen, wenn wir gerade nicht im Copy-Process sind
    If Not flagInProcess Then
        'Nur reagieren wenn wir im Range A1-B43 sind. Ansonste hier die Methode verlassen
        If Target.Row > 43 Or Target.Column > 2 Then Exit Sub
        'Markeiren, dass wir im C&P Modus sind
        flagInProcess = True
        'Quellrange auslesen
        Set srcRng = Range(Cells(Target.Row, 1), Cells(Target.Row, 2))
        MsgBox "Ausgewählte Werte: " & srcRng.Cells(1, 1).Value & " & " & srcRng.Cells(1, 2).Value, vbInformation + vbOKOnly
    'Ausführen, wenn wir im
   
    'Wir sind am Kopieren aber ausserhalb des Zielbereiches
    ElseIf Intersect(Range("I11:J33"), Target) Is Nothing Then
        'Nachfragen um abzubrechen
        flagInProcess = MsgBox("Feld ist nicht im Zielbereich. Weiter kopieren?", vbCritical + vbOKCancel) = vbOK

    'Target im Ziel
    Else
        'Werte Kopieren
        srcRng.Copy Range("I" & Target.Row & ":J" & Target.Row)
        'Nachfragen ob weiter kopiert werden soll
        flagInProcess = MsgBox("Kopiere den Wert nochmals?", vbQuestion + vbOKCancel) = vbOK
        'Falls fertig, sauber aufräumen
        If Not flagInProcess Then Set srcRng = Nothing
    End If
   
End Sub
 
#15
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
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
 
#18
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
Visual Basic:
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, muss ich hier den Befehl flaginProcess = Else setzen?
        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
 
Anzeige

Neue Beiträge

Anzeige