Laufzeitfehler bei Prozedurdurchlauf

Dieses Thema Laufzeitfehler bei Prozedurdurchlauf im Forum "Microsoft Office Suite" wurde erstellt von Mr_Tom, 15. Juni 2010.

Thema: Laufzeitfehler bei Prozedurdurchlauf Hallo zusammen, ich bin am Ende ... Ich habe eine Prozedur, die bestimme Daten aus Excel in Variablen schreibt und...

  1. Hallo zusammen,

    ich bin am Ende ...
    Ich habe eine Prozedur, die bestimme Daten aus Excel in Variablen schreibt und über SendKeys in
    ein Warenwirtschaftssystem einfügt. Zur Fehlerüberprüfung wird das Warenwirtschaftsbild danach kopiert
    und soll im zweiten Tabellenblatt eingefügt werden. Genau hier hackt der VBA Code mit Laufzeitfehler 1004
    Anwendungs- oder objektdefinierter Fehler


    Code:
    ws2.Cells(1, 1).PasteSpecial Format:=Text
    Verwende ich zum testen ws2.cells(1,1).select, macht er das was ich möchte. Führe ich den Code nach Bestätigung
    vom Laufzeitfehler mit F5 oder F8 fort, wird genau das gemacht, was ich möchte ...

    Wer hat eine Idee?

    Vielen Dank!
     
  2. Hi,
    Von dem Format-Parameter steht nichts in der Doku.? Und wenn es den geben würde - warum setzt Du ihn auf Text wenn Du ein Bild einfügen möchtest?
    Probiere es doch mal mit der Paste-Methode:
    Code:
    Worksheets(1).Paste Range(a1) 
    Wenn das nicht hilft, wäre der weiter Code der Procedur hilfreich...

    Gruß
     
  3. Hallo Fizbin,

    funktionieren würde es aber mit dem Format Parameter, theoretisch. Ich möchte ja kein Bild einfügen, sondern Textzeilen.
    Ich habe jetzt folgendes gemacht:

    Code:
    ws2.Paste Destination:=ws2.Range(A1)
    Das kuriose an der Sache ist, auf Rechnern mit WinXP und Office 2007 funktioniert es, so wie es soll.
    Auf Rechnern mit WinVista und Office 2007 nicht ... ich suche diesen Zusammenhang.
     
  4. axo, das Warenwirtschaftsbild hat mich an ein Screenshot denken lassen ;)

    VBA verhält sich in unterschiedlichen Office und Win-Versionen/Installationen oft zickig. Oft liegt es an Kleinigkeiten. Vllt. liegt das Problem auch woanders im Code (z.B. ws2 nicht richtig deklariert,initalisiert,...). Probier daher die Paste-Methode elementar auf den betroffenen Rechnern auszuführen.
    Auf wie vielen Vista-Rechnern läuft der Code nicht (nur einer?)?
    Ich hab hier nur O2003 zur Verfügung.
     
  5. Anbei mal der komplette Code. Ich habe es auf zwei Vista Rechnern probiert. Auf beiden wurde der selbe Fehler ausgelöst.

    Code:
    Option Explicit
    Public Pt As Variant, ws As Worksheet, ws2 As Worksheet, C As Range, Zähler As Long, wb As Workbook, _
    Start As Long, Preis As String, Fehlermeldung As String, Zeit As Long
    
    Private Declare Function GetDesktopWindow Lib user32 () As Long
    Private Declare Function GetWindow Lib user32 (ByVal hWnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function GetWindowLong Lib user32 Alias GetWindowLongA (ByVal hWnd As Long, ByVal wIndx As Long) As Long
    Private Declare Function GetWindowTextLength Lib user32 Alias GetWindowTextLengthA (ByVal hWnd As Long) As Long
    Private Declare Function GetWindowText Lib user32 Alias GetWindowTextA (ByVal hWnd As Long, ByVal lpString As String, _
      ByVal cch As Long) As Long
    Private Declare Function GetParent Lib user32 (ByVal hWnd As Long) As Long
    Private Declare Function GetWindowThreadProcessId Lib user32 (ByVal hWnd As Long, lpdwProcessId As Long) As Long
    
    Const GW_HWNDFIRST = 0: Const GW_HWNDLAST = 1: Const GW_HWNDNEXT = 2: Const GW_HWNDPREV = 3
    Const GW_OWNER = 4: Const GW_CHILD = 5: Const GW_MAX = 5: Const GWL_STYLE = (-16): Const WS_VISIBLE = &H10000000
    Const WS_BORDER = &H800000: Dim proghwnd() As Long, progtitel() As String
    
    Private Function ReturnAPPTitle(param As String) As String
     Dim hWnd&: ReDim Preserve proghwnd(1): ReDim Preserve progtitel(1)
     ->Auch der Desktop ist ein Fenster
      hWnd = GetDesktopWindow
      Call GetWindowInfo(hWnd)
     ->Einstieg
      hWnd = GetWindow(Application.hWnd, GW_HWNDFIRST)
     ->Alle vorhandenen Fenster abklappern
      Do
       Call GetWindowInfo(hWnd)
       hWnd = GetWindow(hWnd, GW_HWNDNEXT)
      Loop Until hWnd = 0
      
      Dim i As Long
      
      For i = 1 To UBound(proghwnd)
        If UCase(progtitel(i)) Like UCase(param) Then
         ->MsgBox proghwnd(I)
          ReturnAPPTitle = progtitel(i)
        End If
      Next
    End Function
    Sub GetWindowInfo(ByVal hWnd&)
     Dim Parent&, Task&, Result&, X&, Style&, Title$
     
     ->Darstellung des Fensters
      Style = GetWindowLong(hWnd, GWL_STYLE)
      Style = Style And (WS_VISIBLE Or WS_BORDER)
          
     ->Title des Fenster auslesen
      Result = GetWindowTextLength(hWnd) + 1
      Title = Space$(Result)
      Result = GetWindowText(hWnd, Title, Result)
      Title = Left$(Title, Len(Title) - 1)
      If Trim(Title) <>  Then
        ReDim Preserve proghwnd(UBound(proghwnd) + 1)
        ReDim Preserve progtitel(UBound(proghwnd) + 1)
        
        proghwnd(UBound(proghwnd)) = hWnd
        progtitel(UBound(proghwnd)) = Title
       ->Debug.Print progtitel(UBound(progtitel))
      End If
      
      ->Elternfenster ermitteln
       Parent = hWnd
       Do
        Parent = GetParent(Parent)
       Loop Until Parent = 0
       
      ->Task Id ermitteln
       Result = GetWindowThreadProcessId(hWnd, Task)
    End Sub
    
    Sub Start_AS()
    Set wb = ActiveWorkbook: Set ws = wb.Sheets(1)
    ws.Name = Daten
    
    Pt = ReturnAPPTitle(*sitzung a*)
    
    If wb.Sheets.Count < 2 Then
      Sheets.Add , wb.Sheets(1)
      ActiveSheet.Name = Knecht
      Set ws2 = wb.Sheets(Knecht)
      Set C = ws.Cells
        Else
          wb.Sheets(2).Name = Knecht
          Set ws2 = wb.Sheets(Knecht)
          Set C = ws.Cells
    End If
    
    Start = Timer
    ws.Activate
    ws.Range(C(2, 2), C(C(65536, 2).End(xlUp).Row, 2)).NumberFormat = 0.000
    
    AppActivate Pt, True
    Application.Wait (Now + TimeValue(00:00:04))
    
    For Zähler = 2 To C(65536, 1).End(xlUp).Row
    Sprungmarke:
      Application.Wait (Now + TimeValue(00:00:02))
      Application.SendKeys {DOWN}, True
      Application.SendKeys {HOME}, True
      C(Zähler, 1).Copy
      Application.SendKeys c, True->C (im Standardmodus AS400 ist belegt mit Einfügen)
      Application.SendKeys {TAB}, True
      Preis = Format(C(Zähler, 2).Value, 0.000)
      Application.SendKeys (Preis), True
      Application.SendKeys e, True
      Application.Wait (Now + TimeValue(00:00:01))
      
      ws2.Range(ws2.Cells(1, 1), ws2.Cells(ws2.UsedRange.Rows.Count, ws2.UsedRange.Columns.Count)).EntireColumn.Delete
      Application.SendKeys y, True->Y (im Standardmodus AS400 ist belegt mit Kopieren)
    
    
      ws2.Paste Destination:=ws2.Range(A1)
      
      Fehlermeldung = ws2.Cells(21, 1).Value
      
      Select Case (Fehlermeldung)
      
      Case Artikel ungültig wegen Lösch-Kennzeichen
        C(Zähler, 3).Value = Artikel ist gelöscht
        GoTo Fehler
      Case Datensatz bereits vorhanden!
        C(Zähler, 3).Value = Datensatz bereits vorhanden!
        GoTo Fehler
      Case Artikel fehlt in Lagerstammdatei
        C(Zähler, 3).Value = falsche ArtNr
        GoTo Fehler
      Case Maximal zulässigen Preis überschritten!
        C(Zähler, 3).Value = Preisstellung prüfen!
        GoTo Fehler
      Case Bitte Preis vorgeben!
        C(Zähler, 3).Value = Kein Preis eingetragen!
        GoTo Fehler
      Case Artikel fehlt in Artikelstammdatei
        C(Zähler, 3).Value = ArtikelNr falsch
        GoTo Fehler
      Case Is <>  
        C(Zähler, 3).Value = Unbekannter Fehler, bitte prüfen!
        GoTo Fehler
      Case Else
        GoTo Weiter
      End Select
        
    Fehler:
      Application.SendKeys {Return}, True
      Application.SendKeys {Return}, True
      Application.Wait (Now + TimeValue(00:00:05))
    
    Weiter:
    Next Zähler
    
    Zeit = Timer - Start
    
      MsgBox Preispflege beendet. & Chr(13) & Chr(13) & _
      Die Prozedur dauerte:  & Format(Zeit / 60, 00) &  Minuten  & Format(Zeit Mod 60, 00) &  Sekunden
    End Sub
    
     
  6. OK, auf den ersten Blick sieht man ziemlich viele Api-Funktionen, die ja sehr Betriebssystemnah arbeiten.
    Wird auf den Vista-Rechnern *wirklich* etwas in die Zwischenablage kopiert (Haltepunkt setzen und manuell prüfen)? Kommt immer noch die im ersten Posting genannte Fehlermeldung?
     
Die Seite wird geladen...

Laufzeitfehler bei Prozedurdurchlauf - Ähnliche Themen

Forum Datum
Laufzeitfehler 374 ??? Software: Empfehlungen, Gesuche & Problemlösungen 18. Apr. 2011
Laufzeitfehler 429 bei WORD Windows XP Forum 29. Apr. 2009
Office 2000: Laufzeitfehler 429, Objekterstellung durch ActiveX-Komponente... Windows XP Forum 23. Mai 2008
Works 2002 - Laufzeitfehler 5981(Microsoft Visual Basic) Windows XP Forum 5. Nov. 2006
Laufzeitfehler ''340'' - Bitte um Hilfe! Software: Empfehlungen, Gesuche & Problemlösungen 11. Aug. 2006