PDA

Vollständige Version anzeigen : VBA 5 Fehler


Despistado
19.09.2019, 21:26
Ist jetzt nicht so furchtbar wichtig aber ich versuche gerade so ein Plugin ab VBA6 in VBA5 zum Laufen zu bringen (obwohl ich davon kaum Ahnung habe) und habe dafür testweise mal Sachen umgeschrieben aber es bleibt dennoch ab einem bestimmten Zeitpunkt stecken..
Vielleicht weiß ja zufällig irgendjemand dem langweilig genug ist was man da ändern könnte.
So sieht jedenfalls die Fehlermeldung aus....
https://s17.directupload.net/images/190919/hq4mgu25.jpg

Und das ist der gesamte Code wobei die Stelle markiert ist wo der Fehler auftritt:
P.S: Passt hier nicht rein, hier ist einfach die Dot Datei mit dem Code.

Wie gesagt, ist jetzt nicht so wichtig aber wenn jemandem langweilig ist kann er/sie sich gerne daran versuchen:

P.P:S Vielleicht wären mal Server mit mehr als 512MB Speicher nett, nicht mal eine Dot-Datei lässt sich anhängen weil sie größer ist als 200KB...
:rolleyes:

Hier also zum Herunterladen:

http://members.kabsi.at/LIGHTYEAR/Zotero.dot

Muller2
19.09.2019, 23:58
Hallo,

teufel :upps: Word97 ist aber asbach, das war ja praktisch gleich nach'm Krieg aktuell, da müsstest Du mal um mind. 2-3 Versionen upgraden, aber zu Deinem Code, Du versuchst ein Array an einen normalen String-Parameter zu übergeben, das haut natürlich nicht hin, den müsstest Du auch als Array deklarieren, schließlich heißt der ja schon bezeichnenderweise mArray...:cool:

Aber nimms mir nicht übel, viel mehr werd ich mir bei dem Codevolumen nicht anschauen, das könnten nicht die letzten Probleme gewesen sein...:grinange:

Gruß, Muller2

Despistado
20.09.2019, 00:42
Ja, das ist nur eine Spielerei also so eine Art "proof of concept".
Ich vermute mal, irgendwie würde es wohl gehen aber ich hab halt kaum Ahnung von VBA. Trotzdem bastle ich manchmal herum und hin und wieder gelingt mir auch mal was (auch ein blindes Huhn findet mal ein korn).

Und wie mach ich aus dem mArray ein Array?

Edit: Kleines Update. Hab jetzt von vorn angefangen und im Moment ein Problem mit "Argumenttyp ByRef unverträglich" in der Zeile:
fnReplace = Replace(sString, sSearch, sReplace)

Siehe Zotero2.dot

http://members.kabsi.at/LIGHTYEAR/Zotero2.dot

P.S. Die in VBA5 normalerweise nicht vorhandene Funktion Replace habe ich durch diese hier "nachgerüstet":

Public Function Replace(sIn As String, _
sFind As String, _
sReplace As String, _
Optional nStart As Long = 1, _
Optional nCount As Long = -1, _
Optional bCompare As Long = 0) As String

Dim nC As Long, nPos As Integer, sOut As String

sOut = sIn
nPos = InStr(nStart, sOut, sFind, bCompare)
If nPos = 0 Then GoTo EndFn:
Do
nC = nC + 1
sOut = Left(sOut, nPos - 1) & sReplace & _
Mid(sOut, nPos + Len(sFind))
If nCount <> -1 And nC >= nCount Then Exit Do
nPos = InStr(nStart, sOut, sFind, bCompare)
Loop While nPos > 0
EndFn:
Replace = sOut

End Function

Mase
20.09.2019, 06:33
Hallo,

teufel :upps: Word97 ist aber asbach, das war ja praktisch gleich nach'm Krieg aktuell, da müsstest Du mal um mind. 2-3 Versionen upgraden, aber zu Deinem Code, Du versuchst ein Array an einen normalen String-Parameter zu übergeben, das haut natürlich nicht hin, den müsstest Du auch als Array deklarieren, schließlich heißt der ja schon bezeichnenderweise mArray...:cool:

Aber nimms mir nicht übel, viel mehr werd ich mir bei dem Codevolumen nicht anschauen, das könnten nicht die letzten Probleme gewesen sein...:grinange:

Gruß, Muller2

ja verreck ich; seltenst so früh schon was zu lachen gehabt :top:

:yelrotfl:

Luschi
23.09.2019, 08:00
Hallo Despistado,

dann versuch es doch mal so:
Function fnJoin(ByVal mArray As Variant, sDelimiter As String) As String

Gruß von Luschi
aus klein-Paris

Despistado
24.09.2019, 20:38
Danke für deine Antwort.
Aber wie gesagt, der Fehler taucht jetzt an einer anderen Stelle auf und zwar bei

Function fnReplace(sString, sSearch, sReplace) As String
#If MACWORD Then
Dim nIndex As Long, nLastIndex As Long
nLastIndex = 1
fnReplace = ""

nIndex = InStr(sString, sSearch)
While (nIndex)
fnReplace = fnReplace & Mid$(sString, nLastIndex, nIndex - nLastIndex) & sReplace
nLastIndex = nIndex + Len(sSearch)
nIndex = InStr(nLastIndex, sString, sSearch)
Wend
fnReplace = fnReplace & Mid$(sString, nLastIndex)
#ElseIf MSWD Then
fnReplace = Replace(sString, sSearch, sReplace)
#Else
Dim substrings
substrings = Split(sString, sSearch)
fnReplace = Join(substrings, sReplace)
#End If
End Function

Bei der gelb markierten Stelle (in der blau markierten Zeile) taucht der Fehler "Argumenttyp ByRef unverträglich" auf.

Die Replace Funktion fehlt in VBA5, es gibt aber Ersatz-Code, siehe Beitrag 3 in diesem Thread.
Ich weiß also nicht ob's an der Replace-Funktion liegt oder ob sonst noch was im argen liegt.

Despistado
25.09.2019, 00:42
P.S. Den Macword-Teil und den Else-Teil kann man wohl außer Acht lassen.
Und die Replace-Funktion funktioniert an sich schon. Komisch also dass der Fehler trotzem auftritt.

haklesoft
25.09.2019, 08:27
Als bei mir vor Jaaahren VBA-Code für Word 2002/2003 und Word 97 im Paralleleinsatz waren hatte ich mir ebenfalls einen Ersatz für Replace gebastelt.
Allerdings habe ich darauf geachtet, dass die Ersatzfunktion nicht genauso benannt ist, wie die Originalfunktion. Das wird bei Deiner Konstellation vermutlich nicht den Ausschlag geben aber Du erkennst jedenfalls sofort, welche Code-Variante im Einsatz ist. Meine alte Ersatzfunktion ist nicht mehr verfügbar aber etwa so hat sie wohl ausgesehen:Function myReplace(sAusdruck As String, sSuche As String, sErsatz As String, _
Optional lStart As Long = 1, Optional lAnzahl As Long = -1, _
Optional lVergleich As VbCompareMethod = 0) As String

Dim sAusgabe As String ' Rückgabestring
Dim lSuche As Long ' Suchlänge
Dim lErsatz As Long ' Ersatzlänge
Dim lZahl As Long ' Anzahl Ersetzungen
Dim lPos As Long ' Suchposition

sAusgabe = sAusdruck ' Ergebnis vorbelegen
lSuche = Len(sSuche) ' Suchlänge ermitteln
lErsatz = Len(sErsatz) ' Ersatzlänge ermitteln

lPos = InStr(lStart, sAusgabe, sSuche, lVergleich) ' 1. Treffer ermitteln
Do While lPos > 0
sAusgabe = Left(sAusgabe, lPos - 1) & sErsatz & Mid(sAusgabe, lPos + lSuche)
lPos = InStr(lPos + lErsatz, sAusgabe, sSuche, lVergleich)
lZahl = lZahl + 1
If lZahl = lAnzahl Then Exit Do
Loop

myReplace = sAusgabe
End FunctionAch ja, die Ersatzfunktion beeinflusst nicht die übergebenen Parameter. Die können also alle auch mit ByVal übergeben werden, wenn ByRef (= Standard) nicht möglich ist.

Despistado
25.09.2019, 20:44
Ok, danke für deine Antwort.

Ich hab jetzt einfach mal deine Replace-Version eingebaut und das ganze so probiert:

' Replaces a string with another
Function fnReplace(ByVal sString As Variant, sSearch As String, sReplace As String) As String

fnReplace = myReplace(sString, sSearch, sReplace)

End Function

Und die Fehlermeldung bleibt dieselbe.
Das interessante/komische ist, dass es einwandfrei funktioniert in Word 2000 (VBA6) wenn man die Original-Replace-Funktion verwendet und nicht mehr funktioniert wenn man irgendeine Ersatz-Replace-Funktion verwendet und zwar auch nicht in Word 2000 (und in Word 97 sowieso nicht).

Das lässt mich vermuten, dass es irgendwie an der Replace-Funktion hakt.

haklesoft
26.09.2019, 13:53
Eine Replace-Funktion und auch die Ersatzvariante ersetzt Teile in einem String. Da darf dann auch nur ein String und kein Objekt, keine Zahl, auch kein Stringarray oder was sonst so in einem Variant stehen kann übergeben werden. Du musst den Inhalt von sString erst passend konvertieren. Schau Dir im Debug-Modus an, was genau in den drei Parametern steht und handle dann entsprechend.' Replaces a string with another
Function fnReplace(ByVal sString As Variant, sSearch As String, sReplace As String) As String
Dim sText As String
sText = CStr(sString) ' < oder was immer erforderlich ist, um einen einzelnen String zu erhalten!!!

fnReplace = myReplace(sText, sSearch, sReplace)

End FunctionNoch ein Hinweis: Du solltest tunlichst alle Entwicklungsarbeiten an diesem Projekt AUSSCHLIEßLICH auf dem Word97-Rechner machen. Nur dann ist Kompatibilität gegeben. Motto: was mit W97 läuft, läuft auch mit W2003, aber nicht umgekehrt. Und wirf unter Extras/Verweise alles raus, was nicht zu W97 passt.

Despistado
26.09.2019, 15:29
Der Grund warum ich das ganze auch in Word 2000 ausprobiert habe war, dass es nichts bringt etwas zu verändern wenn es dann nicht einmal in Word 2000 mehr funktioniert, denn dann weiß ich sicher, dass ich irgendwas an dem Code verändert habe, was eigentlich hätte bleiben müssen wie es ist.

Was den Rest betrifft ist es schwierig, weil ich das Macro (also alle Macros die in der Dot-Datei vorhanden sind) gar nicht wirklich durchschaue.

Es geht bei dem ganzen jedenfalls um so ein Literaturverwaltungsprogramm und eine Einbindung in Word. Man klickt dann auf einen Button um bspw. eine Referenz (wie "(Müller, 1998)") im Word Dokument einzufügen.
Zuerst wird hierfür scheinbar im Word-Dokument {Citation} als Feld eingefügt und dann sollte eigentlich ein Dialogfeld aufklappen wo man den Namen der zu zitierenden Person auswählen kann (das Feld kommt von dem externen Programm, sieht zumindest so aus) und dann sollte vermutlich {Citation} durch den eigentlichen Namen ersetzt werden. So denke ich mir das zumindest.

Dazu kommt es aber nicht weil das ganze bei dem o.g. Fehler hängenbleibt.

Einen Debug-Modus finde ich im VBE irgendwie nicht.

Edit: Ok, der Debug-Modus verbingt sich im Menü "Testen".
Ich hab da mal "kompilieren von project" laufen lassen. Da kommen zwar schon Fehler, die kommen allerdings in Word 2000 auch, diese scheinen also nicht so wichtig zu sein (hängt glaub ich auch damit zusammen dass dieses Word-Plugin auch für OpenOffice gedacht ist). Ich weiß allerdings nicht wie ich das anstellen kann, mir im Debug-Modus anzusehen was in den drei Parametern steht. WIe macht man das? Zur Auswahl hab ich das hier...

https://s17.directupload.net/images/190926/o27ithxb.jpg

haklesoft
27.09.2019, 09:58
das hier...solltest Du Dir genauer anschauen! Einfachste Möglichkeit: in einer Codezeile F9 drücken und Programm starten. Die Ausführung hält am Haltepunkt an und Du kannst mit der Maus im Code über die bis dahin benutzten Variablen fahren.

Ich habe mir den Ursprungscode nun doch einmal angeschaut. Da waren noch eine Anzahl von ByVals erforderlich. Außerdem waren alle Codezeilen zu entfernen, die mit bedingter Kompilierung Bezug zu anderen Officearten hatten. Ob es nun mit W97 oder W00 funktioniert kann ich nicht sagen, da ich die Bearbeitung mit W2016 gemacht habe und mir auch die anderen Voraussetzungen fehlen. Die beiden importierbaren Codemodule hänge ich hier als ZIP an.

Despistado
27.09.2019, 14:39
Danke für die Arbeit die du dir gemacht hast!

Leider tritt aber ein Fehler auf und zwar hier:

Sub subSetPrefs(mprefs)
Dim sDescription As String
Dim sOutput As String
If UBound(mprefs) = 5 Then
'Save preferences in module level variables
ZoteroSessionID = mprefs(0)
ZoteroStyle = mprefs(1)
ZoteroStyleClass = mprefs(2)
ZoteroAllowBibliography = mprefs(3)
ZoteroUseEndnotes = mprefs(4)
ZoteroUseBookmarks = mprefs(5)
End If
'Store preferences in document's description
sOutput = fnJoin(mprefs, ":")
' Set
Call subSetProperty(ZOTERO_PREFS_PROPERTY, sOutput)
End Sub

Ich habe diese Zeile mal mit F9 markiert und das ganze noch mal laufen lassen. Wenn ich dann über diese Stelle mit der Maus fahre steht da leider nicht mehr als sOutput = ""
Also wahrscheinlich nicht sehr hilfreich.
Der Fehler tritt jetzt übrigens auch in Word 2000 auf.
Der Fehler lautet: "Laufzeitfehler 13 Typen unverträglich"

Es gibt zu dem Fehler einiges im Internet zu finden, leider nichts womit ich etwas anfangen könnte.

haklesoft
27.09.2019, 15:07
An fnJoin wird ein Array übergeben und kein einzelner String. Suche nach ' besser so: und probiere dies:Function fnJoin(mArray As Variant, sDelimiter As String) As StringEventuell noch ByVal vor dem ersten Parameter. Musst Du sehen.

Despistado
27.09.2019, 15:14
Dann kommt der Fehler:
Unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet.

Dieser Fehler tritt jetzt jedoch nur mehr in Word 97 auf.

haklesoft
27.09.2019, 15:54
fnJoin und Join machen ja nur eine einfache Stringverkettung. Das kannst Du mit einer Schleife auch selbst erledigen und wärst dann die leidige Array-Übergabe los.

Despistado
27.09.2019, 16:10
Und wie mache ich das?

haklesoft
27.09.2019, 18:15
Zum Beispiel mit einer For-i-Schleife und &.

Solche VBA-Basics solltest Du aber kennen. :entsetzt:

Despistado
27.09.2019, 20:30
Irgendwie ist es mir gelungen trotz mangelnder Kenntnisse das eine oder andere zu bewerkstelligen (dank Internet und dank Foren wie diesen und dank Trial und Error) aber das kann ich wohl nicht.
Ich hatte mal vor 25 Jahren GWbasic in der Schule aber wirklich nur die absoluten Basics von denen ich heute nichts mehr weiß.

Aber selbst wenn ich das mit der Schleife machen könnte, wäre es in diesem Fall trotzdem schwierig weil mir ja gar nicht klar ist was all der Code überhaupt macht.
Mir ist nur klar was am Ende passieren soll, aber jede einzelne Prozedur darin ist mir nicht klar.

P.S. Ich hab jetzt aber gerade herausgefunden, dass es an der fehlenden (und ersetzten) Join-Funktion nicht liegen kann denn in Word 2000 funktioniert das auch mit einer ersetzten Join-Funktion, nicht nur mit der original in VBA6 eingebauten.

P.P.S: Und auf einmal - ohne etwas verändert zu haben - funktioniert es teilweise sogar.
Es lässt sich jetzt mit dem externen Programm eine Verbindung herstellen, das Dialogfeld (von Zotero) klappt auf, es lässt sich ein Autor auswählen und der wird dann korrekt in Word eingefügt (als Feld, so soll das aber auch sein).
Blöderweise funktioniert das ganze nur einmal. Versucht man das nochmals steigt die CPU-Auslastung ins Unermessliche und es passiert nichts mehr. Man kann Word dann nur mehr abwürgen.
Komisch gleich in zweifacher Hinsicht...
Geht plötzlich aus unerfindlichen Gründen aber dann auch nicht wirklich...

Despistado
27.09.2019, 23:58
Ok, ein Schritt weiter immerhin.
Das Problem, dass das ganze nur einmal funktioniert hat und dann nicht mehr lag an der Replace-Funktion. Da ist ein Loop-Teil und sobald bereits ein Eintrag im Word Dokument vorhanden ist, läuft das ganze ständig im Loop. Das ganze konnte ich mit einer anderen Replace-Ersatz-Funktion beheben, die ich zwar auch noch anpassen musste aber jetzt funktioniert der Teil zumindest.

Bleibt leider immer noch das Problem mit dem mArray Kram.