Microsoft Excel

Herbers Excel/VBA-Archiv

Enfache Loop Schleife


Betrifft: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 15:55:47

Hallo,

Ich habe eine Tabelle mit X zeilen in Spalte B und ein Code:

Sub Bsp()
zahl_a = Range("b1").Value
Call Clipboard.Clipboard(zahl_a)
Call MausLinks_Klick
SendKeys "^{v}", True
SendKeys "{DOWN}", True
End Sub
Ich möchte, dass der Code für alle Zellen in der Spalte B ausgeführt wird. Also bei mir fängt er nur bei "B1" an. Er soll alle Zeilen durchlaufen.

  

Betrifft: AW: Enfache Loop Schleife
von: Maik
Geschrieben am: 12.12.2018 16:06:34

Hallo Anna,

For iZähler = 1 To iRowMax
zahl_A = Sheets("Registername").Cells(iZähler,1)
Erklärung: Cell(Zeile,Spalte)
iRow_Max = Sheets("Registername").Cells(1048576, 1).End(xlUp).Row

Maik


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 16:11:29

Hi, dein Code funktioniert so auch nicht :/


  

Betrifft: AW: Enfache Loop Schleife
von: Daniel
Geschrieben am: 12.12.2018 16:07:15

Hi
alle Zellen in Spalte B?
hast du schon mal geschaut, wieviele das sind?
seit Excel 2007 c.a 1,04 Millionen.

nehmen wir nur mal alle Zellen, die zum genutzen Bereich gehören, sonst musst du etwas länger warten, bis das Makro durch ist:

Sub Bsp()
dim Zelle as Range
dim zahl_a
For each Zelle in Intersect(Columns(2), ActiveSheet.Usedrange))
    zahl_a = Zelle.Value
    Call Clipboard.Clipboard(zahl_a)
    Call MausLinks_Klick
    SendKeys "^{v}", True
    SendKeys "{DOWN}", True
Next
End Sub
Gruß Daniel


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 16:10:51

Hallo Daniel, Natürlich meinte ich alle benutzen Zellen :)

Aber dein Code Funktioniert so nicht:

bei der Zeile "For each..."
wird es als fehlerhaft angezeigt.


  

Betrifft: AW: Enfache Loop Schleife
von: Daniel
Geschrieben am: 12.12.2018 16:19:42

hi

ist nur ne klammer zu viel am Ende.
wie korrierst du eigentlich deine Tippfehler, wenn du selber programmierst?
oder schreibst du nur ab ohne selber mit zu denken?
Gruß Daniel


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 16:21:38

Das habe ich schon korrieigert gehabt, aber bei deinem Code kopiert er immer nur die letzte Zeile, also den Wert der letzten Zeile und das x mal


  

Betrifft: AW: Enfache Loop Schleife
von: Daniel
Geschrieben am: 12.12.2018 16:28:43

Hmm
wenn du das schon korrigiert hattest, warum hast du das nicht gleich gesagt und diese Beschreibung schon bei deiner ersten Rückmeldung mit angegeben?

die Fehlerbeschreibung "funktioniert nicht" ist als Fehlermeldung ungefähr so hilfreich wie die Hilfestellung "dann machs anders"

Gruß Daniel


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 16:31:43

Ok mein Fehler also nochmal:

Bei deinem Code kommt ein Loop, aber nur die letzte Zeile wird Ausgeführt, da glaube ich "Zelle" sich auf die letzte Zeile bezieht und der Code nur die Zelle "Zelle" ins Clipboard nimmt und kopiert. Ich wollte gerne, dass es von der ersten zelle bis zur benutzen Zelle im Loop durchläuft. Also im Grunde soll im ersten Durchlauf b1 kopiert werden im zweiten durchlauf soll diesmal b2 kopiert werden, bis zum Schluss. Da habe ich noch Probleme. Ich hoffe du kannst mir dabei helfen. Sorry nochmal :/


  

Betrifft: AW: Enfache Loop Schleife
von: Daniel
Geschrieben am: 12.12.2018 16:38:45

Hi
lass mal diesen Code laufen:

Sub Bsp()
   dim Zelle as Range
   dim zahl_a
   For each Zelle in Intersect(Columns(2), ActiveSheet.Usedrange))
       zahl_a = Zelle.Value
       debug.Print Zelle.Address, zahl_a
   Next
   End Sub
dieser Code zeigt dir im Direktfenster an, über welche Zellen die Schleife läuft und welche Werte dann an das andere Makro übergeben werden.
da ich die beiden Makros, die du aufrufst, nicht kenne und das Problem und auch nicht weiß, was du mit dem Makro überhaupt errreichen willst, kann ich dir da jetzt auch nicht weiter helfen.
die Schleife sollte schon über alle Zellen laufen, aber was mit den Werten dann weiterhin passiert, weißt nur du.

Gruß Daniel


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 16:47:09

Hi, ich glaube hier liegt ein Missverständnis vor :)

also nochmal:

Sub Bsp()
         zahl_a = Range("b1").Value
         Call Clipboard.Clipboard(zahl_a)
         Call MausLinks_Klick
         SendKeys "^{v}", True
         SendKeys "{DOWN}", True
         End Sub
         
Das ist der Code und fängt bei B1 an. Nehmen wir an die Spalte B hat X einträge.
zahl_a = Range("b1").Value
das soll nach jedem Durchgang +1 sein, d.h. bei Durchgang 1 wird der Code mit B1 ausgeführt. Beim Durchgang 2 wird die Range durch B2 ersetzt. Bei Durchgang 3 wird die Range durch B3 ersetzt. Und das so weiter bis der letzte EIntrag erreicht ist. Mir geht es nur darum, das die Range bei zahl_a immer so oft +1 gemacht wird, bis die letzte Zeile erreicht wird.

Danke nochmal für deine Geduld.


  

Betrifft: AW: Enfache Loop Schleife
von: Daniel
Geschrieben am: 12.12.2018 16:58:36

Hi
und genau das macht meine Schleife.
das Problem dürfte in deinen aufgerufenen Makros liegen oder in dem Part, der bei den Sendkeys durchführen willst.
da Sendkeys aber nicht besonders zuverlässig ist, sollstest du mal beschreiben, was du überhaupt erreichen willst.
Steuerung+V ist ja ein Einfügen, und wenn du uns sagst, WO das kopierte eingefügt werden soll, könnte man sich eventuell das Sendkeys-gedöns sparen und das ganze zuverlässiger programmieren.

Gruß Daniel


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 17:02:45

Achso ok.

Also ich habe eine Tabelle, welches Artikelnummern in Spalte B hat. Von B1 bis BX sind nur Strings.

Hier sind die Codes für die anderen Makros:

Public Sub Clipboard(text)
  Dim oData As New DataObject
  oData.SetText text
  oData.PutInClipboard
End Sub


Public Function HoleTextVonZwischenablage() As String
  Dim oData As New DataObject
  On Error Resume Next
  oData.GetFromClipboard
  HoleTextVonZwischenablage = oData.GetText
End Function
und
Private Declare Sub mouse_event Lib "user32.dll" _
    (ByVal dwFlags As Long, ByVal dx As Long, _
    ByVal dy As Long, ByVal dwdata As Long, _
    ByVal dwExtraInfo As Long)
    
Private Declare Function SetCursorPos Lib "user32" _
    (ByVal X As Long, ByVal Y As Long) As Long

Sub MausLinks_Klick()
Const MOUSEEVENT_LEFTDOWN = &H2
Const MOUSEEVENT_LEFTUP = &H4
  
  'Position 1. Parameter Horizontal, 2.Parameter Vertikal
  SetCursorPos 503, 920
  mouse_event MOUSEEVENT_LEFTDOWN, 0, 0, 0, 0   'linksklick
  mouse_event MOUSEEVENT_LEFTUP, 0, 0, 0, 0     'Taste loslassen
   mouse_event MOUSEEVENT_LEFTDOWN, 0, 0, 0, 0   'linksklick
  mouse_event MOUSEEVENT_LEFTUP, 0, 0, 0, 0     'Taste loslassen
End Sub


Mein Code soll eine Zeile aus der Excel Tabelle kopieren und in einem Anderen Programm in eine Zeile für das Angebot einfügen. Danach soll im Programm mit der Pfeiltaste nach unten in die neue leere Spalte und dann soll in Excel die nächste Zeile kopiert werden und wieder in das Anegbotsprogramm eingefügt werden. Dann wieder mit der Pfeiltaste nach unten für die nächste leere Spalte und das solange bis alle Artikel der Excel eingefügt wurden.


  

Betrifft: AW: Enfache Loop Schleife
von: Daniel
Geschrieben am: 12.12.2018 17:37:38

Hi

Ich vermute, dass du in deinem Angebotsprogramm nicht korrekt in die nächste Spalte wechselst und daher die Werte immer an der selben Stelle einfügst und somit den vorherigen Wert überschreibst.
Somit siehst du am Ende nur den letzten Eintrag.

Gruß Daniel


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 12.12.2018 18:04:43

Ne, es wird schon in die nächste Spalte gewechselt, aber nur die letzte Zeile wird eingefügt und das mehrmals.
Bsp:

Spalte B mit
B1 = 1
B2 = 2
B3 = 3
B4 = 4

dann wird im Angebotsprogramm viermal den Wert 4 in 4 verschiedene Spalten eingetragen.


  

Betrifft: AW: Enfache Loop Schleife
von: Anna
Geschrieben am: 13.12.2018 00:29:54

Hast du keine Lösung für mich?


  

Betrifft: AW: Enfache Loop Schleife
von: Daniel
Geschrieben am: 13.12.2018 08:27:45

dazu müsste ich dein ganzes Konstrukt mal live testen können.
Gruß Daniel


  

Betrifft: Wo ist der Wald, ich seh nur Bäume?
von: PeterK
Geschrieben am: 13.12.2018 08:40:04

Hallo Anna, Hallo Daniel

Daniels Schleife funktioniert wunderbar, Dein Ergebnis war leider zu erwarten.
Tastatureingaben und Mouse-Events laufen asynchron, d.h. es wird nur in den entsprechenden Puffer des Betriebssystem geschrieben, wann das Betriebssystem diese dann auch wirklich bearbeitet steht in den Sternen. Was passiert bei Dir: Deine Schleife schreibt in den Puffer und ins Clipboard (und das ziemlich schnell). Wenn das Betriebssytstem anfängt die Eingabe-Events abzuarbeiten, ist Deine Schleife bereits fertig, d.h. der Wert der letzten Zelle steht im Clipboard und wird nun ständig kopiert.

Bau Dir eine kleine WAIT Procedure, z.B.

Sub myWait(wt As Double)
  Dim myT As Double
  myT = Timer()
  Do
    DoEvents
  Loop Until (Timer() > (myT + wt))
End Sub
und füge einige Aufrufe innerhalb Deiner Schleife ein ("z.B. myWait 1", wartet eine Sekunde).
Du musst dem Betriebssystem Zeit lassen, die Befehle abzuarbeiten und den Einfügvorgang abzuschliessen bevor Du einen neuen Wert ins Clipboard schreibst.


  

Betrifft: AW: Wo ist der Wald, ich seh nur Bäume?
von: Anna
Geschrieben am: 13.12.2018 10:25:10

Hallo PeterK,

vielen Dank, genau da war das Problem. Ich habe nun 1 sekunde am Ende angehängt und siehe da: Wunderbar. Danka auch an Daniel für die Hilfe.