Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1416to1420
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA anpassen

VBA anpassen
08.04.2015 09:23:01
Jürgen
Hallo und guten Morgen,
folgender Code funktioniert in der Muster-Datei einwandfrei.
Sub c()
Dim i As Integer
Dim X As Range
Dim Y As Variant
Dim Z As Range
On Error GoTo ende
Set X = Tabelle1.Range("G4:G15").SpecialCells(xlCellTypeFormulas)
ReDim Y(1 To X.Count)
For Each Z In X
If Z  "" Then
i = i + 1
Y(i) = Z.Value
End If
Next
'  X.ClearContents
Tabelle1.Range("K3").Resize(UBound(Y), 1) = WorksheetFunction.Transpose(Y)
Exit Sub
ende:   MsgBox "Nur leere Zellen!"
End Sub
Nur leider nicht in der Datei in der diese Makro gebraucht wird.
Wie muss der Code geändert werden damit ein ganz bestimmtes Tabellen-Blatt (Der Tabellen-Blatt-Name wurde geändert) ansteuern kann.
Folgende Zeilen habe ich versucht anzupassen:
Set X = Tabelle1.Range("G4:G15").SpecialCells(xlCellTypeFormulas)
Tabelle1.Range("K3").Resize(UBound(Y), 1) = WorksheetFunction.Transpose(Y)
Set X = Worksheets("Name").Range("G4:G15").SpecialCells(xlCellTypeFormulas)
Worksheets("Name").Range("K3").Resize(UBound(Y), 1) = WorksheetFunction.Transpose(Y)
leider funktioniert das nicht
Excel zeigt mir keinen Fehler an dafür bricht jedes mal die Datei zusammen.
Hat jemand eine Idee woran das liegen kann?
Diese Makro liegt in Modul4 und wird mit "Alt+F8" + Auswahl Prodzedur-Name gestartet
Mit freundlichen Grüßen
DU Jürgen

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA anpassen
08.04.2015 09:42:43
Nepumuk
Hallo,
warum machst du das so kompliziert? Das ist ein Zweizeiler:
Call Tabelle1.Range("G4:G15").SpecialCells(xlCellTypeFormulas).Copy
Call Worksheets("Name").Range("K3").PasteSpecial(Paste:=xlPasteValues, Transpose:=True)

Gruß
Nepumuk

Anzeige
@Nepumuk
08.04.2015 10:01:18
Rudi
Hallo,
warum Call? Hat das Vorteile?
Danke und Gruß
Rudi

AW: @Rudi
08.04.2015 10:08:32
Nepumuk
Hallo,
mir war gerade so danach. :)
Neee, ich versuch mir gerade sauberes Programmieren wieder anzugewöhnen. VBA 7 ist empfindlich gegen Schlamperei welche die Vorgängerversionen anstandslos geschluckt haben. Da hast du in der Version plötzlich unerklärliche Fehler die nur darauf zurückzuführen sind. Speziell wenn auch noch API's im Spiel sind.
Gruß
Nepumuk

AW: @Nepumuk @Rudi
08.04.2015 10:53:05
Markus
Hallo Nepumuk
Ich wäre sehr interessiert, wo man diese Art von sauberem Programmieren (eine Methode - wohlgemerkt, nicht Prozedur - mit Call aufzurufen) nachlesen kann?
Gruss Markus

Anzeige
AW: @Nepumuk @Rudi
08.04.2015 11:22:36
Nepumuk
Hallo,
nachlesen kannst du so etwas nicht, aber ich hab so Sachen erlebt wo die CopyPicture-Methode immer in einen Fehler lief bis ich sie mit Call aufgerufen habe, dann ging es plötzlich. Das war mir eine Lehre und seitdem sehen meine Programme ein bisschen anders aus. Beispiel:
' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As LongPtr) As LongPtr
Private Declare Function SetActiveWindow Lib "user32.dll" ( _
    ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function FormatMessageA Lib "kernel32.dll" ( _
    ByVal dwFlags As Long, _
    ByRef lpSource As Any, _
    ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, _
    ByVal lpBuffer As String, _
    ByVal nSize As Long, _
    ByRef Arguments As LongPtr) As Long
Private Declare PtrSafe Function GetLastError Lib "kernel32.dll" () As Long

Private Const GWL_EXSTYLE As Long = -20&
Private Const WS_EX_APPWINDOW As LongPtr = &H40000
Private Const LANG_NEUTRAL As Long = &H0
Private Const ERROR_BUFFER As Long = &HC8
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const GC_CLASSNAMEUSERFORM As String = "ThunderDFrame"

Private Sub CommandButton1_Click()
    Call Unload(Me)
End Sub

Private Sub UserForm_Activate()
    
    Dim lngptrFormHwnd As LongPtr, lngptrStyle As LongPtr
    Dim lngptrReturn As LongPtr
    Dim strBuffer As String
    
    On Error GoTo err_exit
    
    With Application
        Let .IgnoreRemoteRequests = True
        Let .Visible = False
    End With
    
    Let lngptrFormHwnd = FindWindowA(GC_CLASSNAMEUSERFORM, Caption)
    If lngptrFormHwnd = 0 Then Call Err.Raise(Number:=vbObjectError, _
        Description:="Userformfenster nicht gefunden.")
    
    Let lngptrStyle = GetWindowLongA(lngptrFormHwnd, GWL_EXSTYLE)
    
    If lngptrStyle = 0 Then
        Let strBuffer = Space$(ERROR_BUFFER)
        Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
            LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
        Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
    Else
        
        Let lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
        
        Let lngptrReturn = SetWindowLongA(lngptrFormHwnd, GWL_EXSTYLE, lngptrStyle)
        
        If lngptrReturn = 0 Then
            Let strBuffer = Space$(ERROR_BUFFER)
            Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
                LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
            Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
        Else
            
            Let lngptrReturn = SetActiveWindow(CLngPtr(Application.hwnd))
            
            If lngptrReturn = 0 Then
                Let strBuffer = Space$(ERROR_BUFFER)
                Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
                    LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
                Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
            Else
                
                Let lngptrReturn = SetActiveWindow(lngptrFormHwnd)
                
                If lngptrReturn = 0 Then
                    Let strBuffer = Space$(ERROR_BUFFER)
                    Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
                        LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
                    Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
                End If
            End If
        End If
    End If
    Exit Sub
    err_exit:
    Call MsgBox("Fehler: " & CStr(Err.Number) & vbLf & vbLf & _
        Err.Description, vbCritical, "Fehlermeldung")
End Sub

Private Sub UserForm_Terminate()
    With Application
        Let .IgnoreRemoteRequests = False
        Let .Visible = True
    End With
End Sub

Mag übertrieben sein, aber Vorsicht ist die Mutter der Porzellankiste.
Gruß
Nepumuk

Anzeige
AW: @Nepumuk @Rudi
08.04.2015 11:50:26
Markus
Hallo Nepumuk
Du hast es scheinbar nicht gemerkt, ich fragte dich, wo steht, dass man eine Methode per Call aufrufen soll.
Gegen den Aufruf einer Prozedur mit Call habe ich nichts. Das unterrichte ich in meinen VBA-Kursen auch als eine mögliche Variante, damit meine Kursteilnehmer auch deinen Code verstehen ;-).
Gruss Markus

AW: @Nepumuk @Rudi
08.04.2015 11:56:22
Nepumuk
Hallo,
eine Methode ist nichts anderes als eine Sub / Function. Schau in den Objektkatalog:
Userbild
Gruß
Nepumuk

Anzeige
AW: @Nepumuk @Rudi
08.04.2015 12:17:38
Markus
Hallo Nepumuk
Das ist mir schon klar, erstelle ja auch selber Klassen. Aber eine Methode ruft meines Wissens nur einer mit Call auf, rate mal wer?
Lassen wir es damit bewendet (du brauchst keine Zeit aufzuwenden einen zweiten Verfechter dieses Programmierstils zu suchen ;-)
Übrigens, das war nicht böse gemeint. Im Gegenteil, ich bewundere deine langjährige und kompetente Mitarbeit in diesem Forum. Dank solchen Leuten wie dich empfehle ich in meinen Kursen dieses Forum, als bestes deutschsprachiges Excel-Forum, weiter.
Gruss Markus

AW: @Nepumuk
08.04.2015 11:01:10
Rudi
Hallo,
VBA 7 ist empfindlich gegen Schlamperei
dann weiß ich künftig wenigstens, wonach ich suchen muss.
APIs habe ich (mangels Kenntnissen) kaum im Einsatz.
Gruß
Rudi
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige