Fehler in Excel 2007 und allgemein in Excel Vba

Hallo Wissende,

XL2007 rechnet bei
=850 * 77,1 falsch (Richtig: 65.536, XL2007: 100.000), siehe dazu:

http://www.wer-weiss-was.de/cgi-bin/forum/showarticl…

Besteht der Überlauf-Fehler des nachfolgenden Codes auch noch in XL 2007 weiter?

Und, tritt dieser Fehler auch in VB6.0 auf?

Der sehr schwierig bis gar nicht erkennbare Fehler besteht darin, daß es trotz

Dim lngLong As Long. intInteger as Integer, bytByte as Byte

bei

lngLong = 32767 + 2 - 32740
lngLong = intInteger + 2 - 32740
lngLong = bytByte + bytByte - 20

jeweils zu Fehler 6, Überlauf kommt.
(Die Abhilfe steht im Code)

[Code stammt bis auf das x usw. von Michael Schwimmer, der auch erklärt warum dieser Fehler auftritt, bei Interesse kann ich das hier posten.]

PS: @Rainer, zum langen Thread zur PID-Nummer, ich habe jetzt Vba-Code mit APIs der aufgrund der Eingabe von z.B. nur „Notep“ auch unter WinXP alles terminiert/abschiesst was so ähnlich heißt, z.B. „Notepad.exe“, und davon auch alle Instanzen falls es mehrmals läuft.
Interesse?

Danke ^ Gruß
Reihnhard

Option Explicit
'
Public Sub ErrorOverflow()
 Dim lngLong As Long
 Dim intInteger As Integer
 Dim bytByte As Byte, x
 On Error GoTo Fehler
 bytByte = 128
 intInteger = 32767

 ' Ab hier immer Fehler 6, Überlauf
 ' Abhilfe mit
 ' lngLong = 32767& + 2 - 32740
 ' lngLong = intInteger + 2& - 32740
 '
 lngLong = 32767 + 2 - 32740
 lngLong = intInteger + 2 - 32740
 lngLong = bytByte + bytByte - 20
 '
Exit Sub
Fehler:
MsgBox Err.Number & " -- " & Err.Description
MsgBox Err.HelpFile
'gibt Fehler, Datei nicht gefunden, aber hier ist auch keine VBa-Hilfe installiert.
'x = Shell(Err.HelpFile)
Resume Next
End Sub

Hallo Reinhard,

PS: @Rainer, zum langen Thread zur PID-Nummer, ich habe jetzt
Vba-Code mit APIs der aufgrund der Eingabe von z.B. nur
„Notep“ auch unter WinXP alles terminiert/abschiesst was so
ähnlich heißt, z.B. „Notepad.exe“, und davon auch alle
Instanzen falls es mehrmals läuft.
Interesse?

eine weitere Lösung ist immer interessant, aber das Problem war inzwischen gelöst. SendMessage Handle, &H10, 0, 0 genügt, weiß ich inzwischen. Das Handle ist bekannt … :smile:

Wenn Du eine Variante hat, die auch funktioniert, wenn das Handle schwer zu finden ist, weil sich der Fenstertitel verändert und man das Programm nicht selbst gestartet hat, interessiert mich das sogar sehr, für den Fall habe ich nämlich noch keine Lösung. :smile:

Gruß, Rainer

eine weitere Lösung ist immer interessant, aber das Problem
war inzwischen gelöst. SendMessage Handle, &H10, 0, 0 genügt,
weiß ich inzwischen. Das Handle ist bekannt … :smile:

Wenn Du eine Variante hat, die auch funktioniert, wenn das
Handle schwer zu finden ist, weil sich der Fenstertitel
verändert und man das Programm nicht selbst gestartet hat,
interessiert mich das sogar sehr, für den Fall habe ich
nämlich noch keine Lösung. :smile:

Hallo Rainer,

auf welche Excel-Version(en) hast du eigentlich Zugriff?

so wie ih das mit meinem bescheidenen API-Überblick sehe, schaut sich der Code alle Fenster/Prozesse an und da wo die eingegebene Exe dahintersteckt lösht er den Prozess.
Ich muß weder PID, Handle noch Fenstertitel kennen.

(Nachfolgend der Code von Michael Schwimmer. In seinem Buch „Excel Vba“, Isbn: 3-8273-2183-2 Buch anschauen steht vorne nur daß die gewerbliche Nutzung untersagt ist, von privater Nutzung steht da nix, also poste ich den Code.)

Hier die Datei:

http://www.hostarea.de/server-09/September-639e0796e…

Gruß
Reinhard

Der Code für den StartButton:

Option Explicit
'
Private Sub CommandButton1\_Click()
Dim Exename As String
Exename = Range("A1")
If Exename = "" Then Exit Sub
 'Teilname der .exe
MsgBox KillProcess(Exename) & vbCrLf & "Prozesse abgeschossen", vbOKOnly, Exename
End Sub

Code im Modul1:

Option Explicit
'
Private Const MAX\_PATH = 260
Private Const TH32CS\_SNAPPROCESS As Long = 2
Private Const PROCESS\_ALL\_ACCESS = &H1F0FFF
'
Private Type PROCESSENTRY32
 dwSize As Long
 cntUsage As Long
 th32ProcessID As Long
 th32DefaultHeapID As Long
 th32ModuleID As Long
 cntThreads As Long
 th32ParentProcessID As Long
 pcPriClassBase As Long
 dwFlags As Long
 szExeFile As String \* MAX\_PATH
End Type
'
Private Declare Function CreateToolhelp32Snapshot \_
 Lib "kernel32" ( \_
 ByVal dwFlags As Long, \_
 ByVal th32ProcessID As Long \_
 ) As Long
' 
Private Declare Function CloseHandle Lib "kernel32" ( \_
 ByVal hObject As Long \_
 ) As Long
' 
Private Declare Function Process32First Lib "kernel32" ( \_
 ByVal hlngSnapshot As Long, \_
 ByRef lppe As PROCESSENTRY32 \_
 ) As Long

Private Declare Function Process32Next Lib "kernel32" ( \_
 ByVal hlngSnapshot As Long, \_
 ByRef lppe As PROCESSENTRY32 \_
 ) As Long
' 
Private Declare Function OpenProcess Lib "kernel32" ( \_
 ByVal dwDesiredAccess As Long, \_
 ByVal bInheritHandle As Long, \_
 ByVal dwProcessId As Long \_
 ) As Long
' 
Private Declare Function TerminateProcess Lib "kernel32" ( \_
 ByVal lngProcess As Long, \_
 ByVal uExitCode As Long \_
 ) As Long
' 
Sub Test()
 'Teilname der .exe
 MsgBox KillProcess("notepad") & vbCrLf & \_
 "Prozesse abgeschossen", vbOKOnly, "notepad"
End Sub
'
Public Function KillProcess( \_
 strExeName As String \_
 ) As Long
 Dim lngSnapshot As Long
 Dim udtProzessinfo As PROCESSENTRY32
 Dim lngRet As Long
 Dim lngProcess As Long
 Dim strName As String
 'Schnappschuss aller momentan laufenden Prozesse erzeugen
 lngSnapshot = CreateToolhelp32Snapshot(TH32CS\_SNAPPROCESS, 0&amp:wink:
 With udtProzessinfo
 .dwSize = Len(udtProzessinfo)
 'Infos über ersten Prozess
 lngRet = Process32First(lngSnapshot, udtProzessinfo)
 Do While lngRet
 ' Durchlaufen, solange lngRet Null ist
 ' Beim ersten Auftreten von chr(0) kürzen
 strName = StringFromASCIIZ(.szExeFile)
 If InStr(1, LCase(strName), LCase(strExeName)) Then
 'Richtige ausführbare Datei gefunden
 'Prozesshandle holen
 lngProcess = OpenProcess(PROCESS\_ALL\_ACCESS, \_
 0, .th32ProcessID)
 If lngProcess Then
 'Prozess schonungslos abschießen
 TerminateProcess lngProcess, 0&
 ' Anzahl abgeschossener Prozesse zurückgeben
 KillProcess = KillProcess + 1
 'Handle schließen
 CloseHandle lngProcess
 End If
 End If
 'Infos über nächsten Prozess
 lngRet = Process32Next(lngSnapshot, udtProzessinfo)
 Loop
 End With
'Handle schließen
CloseHandle lngSnapshot
End Function
'
Private Function StringFromASCIIZ(ASCIIZ As String)
 'ASCIIZ String kürzen
 If InStr(1, ASCIIZ, Chr(0)) \> 0 Then
 StringFromASCIIZ = Left$(ASCIIZ, InStr(1, ASCIIZ, Chr(0)) - 1)
 Else
 StringFromASCIIZ = ASCIIZ
 End If
End Function

Hallo Reinhard,

auf welche Excel-Version(en) hast du eigentlich Zugriff?

auf meinem Rechner ist Excel97, ich habe ‚Office 97‘ installiert und das soll auch so bleiben, weil ich sonst meine produktiven datenbanken nicht mehr pflegen kann. Wenn ich auf andere rechner ausweiche habe ich auch Office 2000 und 2003 zur verfügung, als Admin ist man da flexibel. :smile:

so wie ih das mit meinem bescheidenen API-Überblick sehe,
schaut sich der Code alle Fenster/Prozesse an und da wo die
eingegebene Exe dahintersteckt lösht er den Prozess.
Ich muß weder PID, Handle noch Fenstertitel kennen.

(Nachfolgend der Code von Michael Schwimmer. In seinem Buch
„Excel Vba“, Isbn: 3-8273-2183-2 Buch anschauen steht vorne nur daß die
gewerbliche Nutzung untersagt ist, von privater Nutzung steht
da nix, also poste ich den Code.)

Das werde ich heute Abend testen, ich hatte schon mehrere Beispiele, die mit Terminate Prozess einen Thread abschießen, nur haben die bisher alle nicht auf meinem Rechner funktioniert.

Gruß, Rainer

auf meinem Rechner ist Excel97, ich habe ‚Office 97‘
installiert und das soll auch so bleiben, weil ich sonst meine
produktiven datenbanken nicht mehr pflegen kann. Wenn ich auf
andere rechner ausweiche habe ich auch Office 2000 und 2003
zur verfügung, als Admin ist man da flexibel. :smile:

Hallo Rainer,

ich schreibe oft auf XL97, damit es überall laufen soll.

Hauptsächlich gibt es nur 3 Dinge die mir in XL97 gegenüber höheren Versionen „fehlen“, bzw. Fehler in XL97 bringen.

  1. Zum einen haben die mehr Parameter bei „Sort“. ist ja kein Akt, dann lösche ich die wenn ich Code teste auf XL97.

  2. XL 97 kennt leider kein „Split()“, muß man sich halt nachbauen als Funktion.

  3. wie 2) für „InstrRev“

Da ich keinen Unsinn wie farbige Tabellelnreiter u.ä. brauche, habe ich allein durch die Beachtung dieser 3 Punkte schon fast alle auftretenden Versionskonflikte bei „normalem“ Code erschlagen, also für nahezu alle Anfragen hier im Tabellenbrett.

Gruß
Reinhard

1 Like

Hallo Reinhard,

also für nahezu alle Anfragen hier im Tabellenbrett.

dafür brauche ich es ja gelegentlich, sonst nicht. :smile: Mit Excel arbeitet unsere Sekretärin und die kommt ohne mich zurecht.

Danke für die Info!

Gruß, Rainer