Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1040to1044
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

Fehlersuche

Fehlersuche
26.01.2009 11:46:00
adrian
Hallo,
kann mir vll. jmd. sagen wo der fehler steckt? seh ihn nicht =/
Variablen LB, OBcount und OBjekt sind außerhalb richtig deklariert.
OEMNamen is ein Array mit Namen enthalten und an der stelle "OBCount" ist es vom Typ "String"
Warum meckert er an der Stelle des Funktionsaufrufs (fett unterstrichen) und sagt:
By ref argument type mismatch!
lg
adrian

Sub AddAccessWindow(Stelle As Range, OEMNamen As Variant, ODMName As String)
Dim i As Integer, ArrAccessReturn As Variant
For OBCount = 0 To 3
If OEMNamen(OBCount)  "" Then
ReDim ArrAccessReturn(0 To 2)
With ActiveSheet
Set Objekt = OLEObjects.Add(ClassType:="Forms.ListBox1", Left:=Stelle.Left, _
Top:=Stelle.Top, Width:=Stelle.Width, Height:=Stelle.Height)
Set LB = Objekt.Object
With LB
.Name = ODMName & "AccessBox" & OEMNamen(OBCount)
.IntegralHeight = False
.Width = 120
.Height = 50
.TextAlign = fmTextAlignCenter
.BorderStyle = fmBorderStyleSingle
.ListStyle = fmListStylePlain
.Font = "Georgia"
.Font.Bold = True
.Font.Size = 16
.SpecialEffect = fmSpecialEffectFlat
.MultiSelect = fmMultiSelectSingle
.Shadow = True
ArrAccessReturn = ResultControls(OEMNamen(OBCount), ODMName)
For i = 0 To 2
If ArrAccessReturn(i)  "" Then
.AddItem ArrAccessReturn(i)
End If
Next
End With
With .Shapes(Objekt.Name)
Placement = 1
End With
Set Stelle = Stelle.Offset(0, 2)
End With
End If
Next OBCount
End Sub


Aufgerufene Fkt.


Function ResultControls(WKS As String, GRP As String) As Variant
Dim Ending As Variant, Identifier As Variant, i As Integer, VarResult As Variant
Ending = Array(" (US)", " (EU)", " (A)")
Identifier = Array("US = ", "EU = ", "Asia = ")
For i = 0 To 2
For Each Objekt In Worksheets(WKS & Ending(i)).OLEObjects
If Objekt.progID = "Forms.OptionButton.1" Then
If InStr(Objekt.Object.GroupName, "FC" & GRP) Then
If Objekt.Object.Value Then
VarResult(i) = Identifier(i) & Objekt.Object.Caption
End If
End If
End If
Next
Next
ResultControls = VarResult
End Function


8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehlersuche
26.01.2009 12:42:38
fcs
Hallo Adrian,
wahrscheinlich bereitet der Übergang von den im Variant-Array "OEMNamen" vorhandenen Werten auf den von der Function geforderten Typ String für die Variable WKS beim Aufruf Probleme.
Ändere die Function wie folgt:

Function ResultControls(ByVal WKS As String, ByVal GRP As String) As Variant

Ob die Variable GRB hier ebenfalls den Zusatz ByVal zwingend benötigt kann ich nicht genau sagen
Gruß
Franz

AW: Fehlersuche
26.01.2009 13:19:00
adrian
Hi Franz,
danke das war der Fehler =)
jetzt hakt es noch an einer Sache, woran ich auch noch auf Fehlersuche bin!
Rufe die Fkt. im Sheet folgend auf: (fett markiert)
Wenn ich den Aufruf weglasse funktioniert alles!
mit kommt folgende Fehlermeldung:
Run-time error '424':
Object required

lg
adrian
For Each Cell In Range("ODMListB")
ReDim ArrOEMNamen(0 To 3)
ODMSum = 0
If Cell.Value "" Then
ODMName = Cell.Value
ODMSum = SearchODMValue(Worksheets("Overview").Range("PhilipsODM"), ODMName)
ODMSum = ODMSum + SearchODMValue(Worksheets("Overview").Range("SonyODM"), ODMName)
ODMSum = ODMSum + SearchODMValue(Worksheets("Overview").Range("SamsungODM"), ODMName)
ODMSum = ODMSum + SearchODMValue(Worksheets("Overview").Range("LGElecODM"), ODMName)
AddingTextbox Cell.Offset(2, 0), ODMSum
ArrOEMNamen(0) = SearchOEM(Worksheets("Overview").Range("PhilipsODM"), ODMName, "Philips")
ArrOEMNamen(1) = SearchOEM(Worksheets("Overview").Range("SonyODM"), ODMName, "Sony")
ArrOEMNamen(2) = SearchOEM(Worksheets"Overview").Range"SamsungODM"),ODMName, "Samsung")
ArrOEMNamen(3) = SearchOEM(Worksheets("Overview").Range("LGElecODM"), ODMName, "LG Elec.")
AddingListBox Cell.Offset(8, 0), ArrOEMNamen
AddAccessWindow Cell.Offset(16, -1), ArrOEMNamen, ODMName
End If
Next
Anzeige
AW: Fehlersuche
26.01.2009 13:55:00
adrian
Hi, habe schon ein paar Schussligkeiten gefunden =)
wie z.B. den "." for OLEObjects...
momentan hängts grad an "Type mismatch" bevor die Werte aus den Arrays in die ListBox eingelesen werden.
lg
adrian
AW: Fehlersuche
26.01.2009 16:36:00
adrian
Hi,
Es funktioniert nun =)
DOCH habe ich immer noch ab und zu mal eine Fehlermeldung:
Run-time error '-2147319764 (8002802c)':
Method 'Name' of Object 'IMdc Text' failed

Das Problem hatte ich vorher schon, d.h. es liegt nicht zwangsweise an der Namensvergebung der Listen!
Ich meine es hat mit dem Aufruf von AddingTextbox Cell.Offset(2, 0), ODMSum etwas zu tun.
Ich habe alle Variablen überprüft und Sie haben keine Keyword Eigenschaft!
Im Hauptblatt werden die erstellten Objekte bevor sie neu generiert werden, mit den Beiden letzten Funktionen gelöscht. Quasi steht weiter oben im Syntax einfach "DelteTextBox" und "DeleteListbox"
kann es am Fkt.-Namen liegen?
lg
adrian
hier nochmal die aufgerufenen Funktionen:
Sub AddAccessWindow(Stelle As Range, OEMNamen As Variant, ODMName As String)
Dim i As Integer, ArrAccessReturn As Variant
For OBCount = 0 To 3
If OEMNamen(OBCount) "" Then
ReDim ArrAccessReturn(0 To 2)
With ActiveSheet
Set Objekt = .OLEObjects.Add(ClassType:="Forms.ListBox.1", Left:=Stelle.Left, _
Top:=Stelle.Top, Width:=Stelle.Width, Height:=Stelle.Height)
Set LB = Objekt.Object
With LB
.Name = ODMName & "AccessBox" & OEMNamen(OBCount)
.IntegralHeight = False
.Width = 200
.Height = 65
.TextAlign = fmTextAlignLeft
.BorderStyle = fmBorderStyleSingle
.ListStyle = fmListStylePlain
.Font = "Georgia"
.Font.Bold = True
.Font.Size = 16
.SpecialEffect = fmSpecialEffectFlat
.MultiSelect = fmMultiSelectSingle
.Shadow = True
ArrAccessReturn = ResultControls(OEMNamen(OBCount), ODMName)
For i = 0 To 2
If ArrAccessReturn(i) "" Then
.AddItem ArrAccessReturn(i)
End If
Next
End With
Set Stelle = Stelle.Offset(6, 0)
End With
End If
Next OBCount
End Sub


Sub AddingTextbox(Stelle As Range, ODMSum As Double)
With ActiveSheet
Set Objekt = .OLEObjects.Add(ClassType:="Forms.TextBox.1", Left:=Stelle.Left, _
Top:=Stelle.Top, Width:=Stelle.Width, Height:=Stelle.Height)
Set TB = Objekt.Object
With TB
.Name = "ODMVolumeBox" & ActiveSheet.OLEObjects.Count
.Width = 120
.Height = 25
.TextAlign = fmTextAlignCenter
.Font = "Georgia"
.Font.Bold = True
.Font.Size = 16
.Value = ODMSum
End With
End With
End Sub


Sub AddingListBox(Stelle As Range, OEMNamen As Variant)
Dim i As Integer
With ActiveSheet
Set Objekt = .OLEObjects.Add(ClassType:="Forms.ListBox.1", Left:=Stelle.Left, _
Top:=Stelle.Top, Width:=Stelle.Width, Height:=Stelle.Height)
Set LB = Objekt.Object
With LB
.Name = "ODMList" & ActiveSheet.OLEObjects.Count
.IntegralHeight = False
.Width = 120
.Height = 50
.TextAlign = fmTextAlignCenter
.BorderStyle = fmBorderStyleSingle
.ListStyle = fmListStylePlain
.Font = "Georgia"
.Font.Bold = True
.Font.Size = 16
.SpecialEffect = fmSpecialEffectFlat
.MultiSelect = fmMultiSelectSingle
.Shadow = True
For i = 0 To 3
If OEMNamen(i) "" Then
.AddItem OEMNamen(i)
End If
Next
End With
End With
End Sub


Function ResultControls(ByVal WKS As String, ByVal GRP As String) As Variant
Dim Ending As Variant, Identifier As Variant, i As Integer, VarResult As Variant, Marked As String, Business As String, AccessValue As String
Ending = Array(" (US)", " (EU)", " (A)")
Identifier = Array("US = ", "EU = ", "Asia = ")
ReDim VarResult(0 To 2)
For i = 0 To 2
For Each Objekt In Worksheets(WKS & Ending(i)).OLEObjects
If Objekt.progID = "Forms.OptionButton.1" Then
If InStr(Objekt.Object.GroupName, "FC" & GRP) Then
If Objekt.Object.Value Then
AccessValue = Objekt.Object.Caption
Marked = "Yes"
End If
Business = "Yes"
End If
End If
Next Objekt
If Marked = "Yes" Then
VarResult(i) = Identifier(i) & AccessValue
Else
VarResult(i) = Identifier(i) & "Not marked!"
End If
If Business "Yes" Then
VarResult(i) = Identifier(i) & "No " & GRP & " business!"
End If
Next
ResultControls = VarResult
End Function



Private Function SearchOEM(ODMArea As Range, ODMName As String, OEMName As String) As String
Dim Zelle As Range, Found As String
For Each Zelle In ODMArea
If Zelle.Value = ODMName Then
Found = "Yes"
SearchOEM = OEMName
End If
Next
If Found  "Yes" Then SearchOEM = Empty
End Function


Sub DeleteTextBox()
For Each Objekt In ActiveSheet.OLEObjects
If InStr(Objekt.Name, "ODMVolumeBox") Then Objekt.Delete
Next Objekt
For Each Objekt In ActiveSheet.OLEObjects
If InStr(Objekt.Name, "AccessBox") Then Objekt.Delete
Next Objekt
For Each Objekt In ActiveSheet.OLEObjects
If InStr(Objekt.Name, "TextBox") Then Objekt.Delete
Next Objekt
End Sub


Sub DeleteListBox()
For Each Objekt In ActiveSheet.OLEObjects
If InStr(Objekt.Name, "ODMList") Then Objekt.Delete
Next Objekt
For Each Objekt In ActiveSheet.OLEObjects
If InStr(Objekt.Name, "ListBox") Then Objekt.Delete
Next Objekt
End Sub


Anzeige
AW: Fehlersuche
26.01.2009 17:10:00
fcs
Hallo Adrian,
es ist nicht so ganz einfach, durch deine Objekt-Welt durchzusteigen.
Meine Vermutung ist, dass bei der Namens-Zuweisung für die Textboxen und die Listboxen ein Fehler steckt.
Ähnlich muss du dann ggf. auch die Prozedur AddingListbox anpassen.
Eine weitere Möglichkeit wäre noch, dass unzulässige Zeichen in den Namen sind, die zugewiesen werden sollen. Kandidaten: ? \ / : , ;
Allerdings gibt es dann meines Wissens eine andere Fehlermeldung.
Gruß
Franz

Sub AddingTextbox(Stelle As Range, ODMSum As Double)
With ActiveSheet
Set Objekt = .OLEObjects.Add(ClassType:="Forms.TextBox.1", Left:=Stelle.Left, _
Top:=Stelle.Top, Width:=Stelle.Width, Height:=Stelle.Height)
Set TB = Objekt.Object
With TB
Objekt.Name = "ODMVolumeBox" & ActiveSheet.OLEObjects.Count '### geändert
.Width = 120
.Height = 25
.TextAlign = fmTextAlignCenter
.Font = "Georgia"
.Font.Bold = True
.Font.Size = 16
.Value = ODMSum
End With
End With
End Sub


Anzeige
AW: Fehlersuche
27.01.2009 11:15:20
adrian
Hi Fanz,
ja da gebe ich dir recht und will mich ganz herzlich für deine Mühe bedanken! =)
Du hast mir mal diese variante geschickt....
sollte ich vll. besser diese nehmen?
Kann es sein das es an der Berechnung der eingetragenen Werte in die Boxen und Listen liegt?
Das die dauer der Berechnung, das Beziehen der benötigten Namen und Werte verzögert bzw. überschreitet?
lg
adrian
Sub Test()
Dim cell As Range, objShape As Shape
Dim ODMSum As Double
On Error GoTo Fehler
For Each cell In Range("ODMListB")
ODMSum = 0
If cell.Value "" Then
'Textbox einfügen 2 Zeilen unterhalb Zelle
Set objShape = ActiveSheet.Shapes.AddTextbox(Orientation:=msoTextOrientationHorizontal, _
Left:=cell.Offset(2, 0).Left, _
Top:=cell.Offset(2, 0).Top, _
Height:=cell.Offset(2, 0).Height, _
Width:=cell.Offset(2, 0).Width)
'Textbox umbenennen
objShape.Name = "ODMVolumeBox" & cell.Value
'Namen auswerten und Summen berechnen
ODMSum = SearchODMValue(Worksheets("Overview").Range("PhilipsODM"), cell.Value)
ODMSum = ODMSum + SearchODMValue(Worksheets("Overview").Range("SonyODM"), cell.Value)
ODMSum = ODMSum + SearchODMValue(Worksheets("Overview").Range("SamsungODM"), cell.Value)
'Summe in Textbox eintragen und Textbox formatieren
With objShape.TextFrame
.Characters.Text = Format(ODMSum, "#,##0.00")
.HorizontalAlignment = xlHAlignCenter
.VerticalAlignment = xlVAlignCenter
End With
End If
Next
Fehler:
With Err
If .Number 0 Then
Select Case .Number
Case 70 'Textbox mit name existiert schon
MsgBox "Fehler-Nr. : " & .Number & vbLf & .Description & vbLf _
& "Textbox mit dem Namen ""ODMVolumeBox" & cell.Value & """ existiert bereits!" _
& vbLf & "Erstellte Textbox wird nicht umbenannt!"
Resume Next
Case Else
MsgBox "Fehler-Nr. : " & .Number & vbLf & .Description
End Select
End If
End With
End Sub


'Suchfunktion:


Private Function SearchODMValue(SearchArea As Range, Name As String) As Double
Dim cell As Range
For Each cell In SearchArea
If cell.Value = Name Then
SearchODMValue = SearchODMValue + cell.Offset(5, 0).Value
End If
Next
End Function


Anzeige
AW: Fehlersuche
27.01.2009 14:22:00
fcs
Hallo Adrian,
es spricht ja nichts dagegen, dass man viele Aktionen in Sub-Routinen auslagert. Oft ist es ja so, dass man die gleich Subroutine dann in vielen VBA-Projekten unverändert verwenden kann. Zudem wird durch die Strukturierung in Teilaufgaben ein VBA-Projekt leichter lesbar und einfacher in der Wartung und Pflege.
Wo genau der Wurm in deinen Prozeduren steckt ist halt schwierig herauszulesen.
Ich persönlich hab auch nicht so viel Erfahrungen mit der Programmierung von OLE-Objekten, die generiert, bearbeitet und dann ggf. wieder gelöscht werden, und das womöglich mehrmals in Folge.
Ich bevorzuge für die Darstellung von Informationen nun mal Tabellenzellen und permanente OLE-Objekte, die bei Bedarf sichtbar/unsichtbar geschaltet werden.
Ob mein früherer Vorschlag weniger Probleme bereitet weiss ich nicht. Er erzeugt halt einen anderen Typ Objekt, um die Textinformation darzustellen.
Gruß Franz
Anzeige
AW: Fehlersuche
27.01.2009 15:14:00
adrian
Bug ist nach der Änderung .Name zu Objekt.Name nicht mehr aufgetreten =)
lg & Danke sehr!
adrian

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige