1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Excel: Laufzeitfehler '438'

Discussion in 'Office-Programme' started by Doctore IV, Jan 29, 2007.

Thread Status:
Not open for further replies.
  1. Urs2

    Urs2 Megabyte

    @Hascheff > war abwesend

    Richtig, aber unter Optionen...\Editor muss dazu "Variablendeklaration erforderlich" angekreuzt sein.

    Das Problem mit den unverträglichen Typen löst so der Compiler aber nicht, er akzeptiert als As Double auch einen schon im Code geschriebenen String... was dann einen Laufzeitfehler ergibt.
    Was der User einzugeben beliebt, kann man natürlich sowieso nicht wissen, man muss es also abfangen... als Variant!
    So wird aus der mickrigsten Aufgabe schnell ein Riesending.

    Das Problem scheint aber nicht mehr aktuell zu sein - vielleicht ist der PC ja in den 20 Megavolt verdampft...

    Gruss Urs
     
  2. Hascheff

    Hascheff Moderator

    Sicher, aber so etwas vergesse ich natürlich. Ich verschwende ja keinen Gedanken daran, den Haken rauszunehmen.
    Hab ich jetzt was verpasst? Von unverträglichen Typen war doch keine Rede. Bei Checkboxen kann man doch diesbezüglich nichts falsch machen.
    Ich denke, das Problem wurde in der Zwischenzeit durch eine aktualisierte Mappe gelöst.
    War aber eine nette Plauderei.
     
  3. Urs2

    Urs2 Megabyte

    @Hascheff

    1. ...ich hatte dafür vergessen, dass man dort den Haken reinsetzen kann... Beim schnellen Ausprobieren mit Variablen a, b, c, usw ist mir das ewige Deklarieren lästig, im fertigen Ding kann ich zur Sicherheit immer noch Explicit darüber schreiben.

    2. In #19 hatte ich in einem Nebensatz die Typen etwas zusammenhanglos erwähnt, wohl weil mir das immer den grössten Aerger bereitet. Es betrifft natürlich vor allem Textboxen und den internen Code.
    Aber, Checkboxen kann man auch mit Integer (und den anderen Zahlenformaten) füttern und abfragen, sie liefern wunschgemäss False oder 0 resp. True oder -1. Falsche Weiterverarbeitung liefert dann erst den Fehler...

    Ja es war eine nette Plauderei, sie zwingt einem, längst Vergessenes wieder einmal nachzuschlagen.

    Gruss Urs
     
  4. Urs2

    Urs2 Megabyte

    @Hascheff

    Der Mensch denkt... aber manchmal braucht er etwas Zeit...

    Meine Erwähnung, dass Boolean-Werte auch als Integer abgefragt werden können, hatte mich nachträglich zum Denken über den Nutzen dieser Tatsache inspiriert.
    Es hätte auch in diesem Projekt positive Auswirkungen!

    Unser ärztlicher Freund hatte in #13 eine lange Reihe von If-Then-Else-Anweisungen ausführen lassen, mit dem einzigen Zweck, die Boolean-Werte in Integer zu wandeln und eine Variable oder was das sonst gewesen sein könnte zu füttern (unter anderem unser berüchtigtes Check20000).

    Eine einzige Zeile liefert genau das gleiche Resultat (Abs lässt sich den Wert der Box von sich aus als Integer liefern):
    Check20000 = Abs(chb20000kv.Value )

    Da mit Check20000 ja irgendetwas gemacht wird, könnte man vielleicht sogar auf diese Zeile verzichten und Abs unter Umständen gleich dort einbauen.

    (Abs(chb20000kv.Value )*(Formel [=Betrag, Mannstunden oder sonst was]))

    würde z.B. gleich den Mehrauwand (oder sonst was) liefern, oder bei False eben 0...

    Gruss Urs
     
  5. Hascheff

    Hascheff Moderator

    Du hast recht.
    Das ist kürzer, der Code wird übersichtlicher (wenn man's begriffen hat).
    Wenn man die Namen der beiden langen Sub's und ihre abschließenden Befehle betrachtet, kommt man zur Vermutung, dass mit Unload Me eine Mail an die Firma, die die Excel-Datei samt Code erstellt hat, geschickt wird.
    Der Absender setzt Haken in Klickboxen und der Empfänger erhält Zahlen.
    geht nach Unload Me sicher nicht mehr.
     
  6. Urs2

    Urs2 Megabyte

    @Hascheff

    Hatte ich übersehen, alles Gespeicherte geht dann ja ins Nirvana...

    Ich sehe das so: Das Form mit den vielen Boxen enthält 3 Buttons, Abruch + Print + Mail (die .XLS wird dann vielleicht als PDF-Anhang gemailt).
    Die im Form ermittelten Daten werden an das Sheet geschickt und sind dort definitiv gespeichert. Vielleicht werden sie dort noch weiter verarbeitet. Das Sheet wird wohl aus einer Vorlage generiert, mit allem Text schon vorgegeben. Das Ganze geht dann an den Kunden, den Bauführer, das Amt, die Akte...

    Das zweite lange Sub ist überflüssig (mehr Code - mehr Schreibfehler). Fast am Ende des ersten reicht >
    > Wenn Print gedrückt, dann dieses, sonst jenes.
    Dazufügen würde ich noch den Befehl "Beides" - Die Aktenschränke wollen ja auch gefüttert werden...

    Der Befehl zum Schreiben der Boxwerte ins Sheet ist falsch (Weiter oben, bei den Texteingaben, ist er aber richtig!). Ich würde:

    Den Zellen im Sheet einen Namen geben (Namen sind weniger schreibfehleranfällig als Zellen, da selbsterklärend) und dann:

    Application.Goto Reference:="Check20000"
    Selection.Value = Abs(chb20000kv.Value)

    Jetzt sind die ganzen IfThenElse zur Datentyp-Umwandlung gnadenlos zu erschlagen.
    Vielleicht gehts ja auch noch eleganter...

    Wir kriegen das Ding schon noch hin - jetzt gehts um die Ehre!
    Aber vielleicht schaut uns der Doctore ja auch unangemeldet zu... dann möge er jetzt aber tiefrot anlaufen!

    Gruss Urs
     
  7. Hascheff

    Hascheff Moderator

    Nö, find ich nicht, dazu fehlen uns ein paar Informationen. Ich denke, wir haben genug spekuliert.
    Wie ich schon sagte,
    Mit dem doppelten Code hast du recht, ich hätte eine Unterprozedur geschrieben, die von beiden Schaltflächen aufgerufen wird.

    So, nun mach ich aber endgültig Schluss, solange sich der TO nicht meldet.
     
  8. Doctore IV

    Doctore IV Byte

    Ich bitte um verzeihung das ich mich nicht melden konnte, ich hatte Urlaub!

    Ja, es geht um KV Netze. Wenn ich die Tabelle öffne fragt er mich zunächst ob ich die Makros aktivieren möchte oder nicht, da gehe ich auf aktivieren. Es handelt sich bei der ganzen Tabelle um nur ein Tabellellenblatt um die eine Frage zu beantworten.

    Ich habe als erstes einmal den Veränderten Code Hascheff eingegeben und tatsächlich hat es aufgehört die angegebene Codezeile gelb zu markieren, es ist eine Spalte nachunten gegangen und hat jetzt

    Application.ActiveSheet.Check230 = 0
    gelb markiert...

    Excel und die ganzen Codes sind leider nicht umbedingt mein Bereich, ich arbeite lieber in Word oder PowerPoint, daher verstehe ich nicht wirklich viel von den Makros...

    Urs2: du hast recht, es gibt keine 20000kV, jetzt mal eine ganz doofe spekulation, kann der Fehler einfach behoben sein, wenn ich statt 20000 20KV schreibe? das höchste was es in kV gibt sind 380kV...

    Ich bitte nochmal um entschuldigung das ich mich so lange auf die ganzen Antworten nicht gemeldet habe, aber es war leider nicht möglich!

    Danke für eure Hilfe!!!!

    Gruß
    Doctore IV
     
  9. Urs2

    Urs2 Megabyte

    @doctore
    Schön dass Du noch da bist, wir hatten schon die schlimmsten Befürchtungen mit den 20 Megavolt...

    Das verstehe ich nicht. Ist dort überhaupt kein Text drauf? Du kannst Deinen Leuten doch nicht einfach Nullen und Einser schicken. Was sollen die damit machen ohne Erklärung?
    Schreibt das Makro dann wenigsten Deine Texteingaben (Name, Adresse...) ins Excel-Blatt?

    Nein, das darfst Du nicht. Den Namen vergibt der Programmierer so, damit er selbst später noch begreifen wird, was er damals damit wollte. Der PC liest nur Buchstaben/Zahlenfolgen, es könnte dort auch xPzUUy7M stehen oder Kartoffelsack (später herauszufinden, was damit gemeint war, wird dann schwierig). Wichtig ist aber, dass der Name überall gleichgeschrieben ist, im Makro und im Excelblatt.

    Klär zuerst ab, ob im Excel-Blatt Namens-Bereiche festgelegt wurden. In Excel, links oben, dort wo die Zellnummern angegeben sind: Click auf den Pfeil daneben > Jetzt müssten die benannten Bereiche erscheinen, unter anderen einer namens "Check20000". Wenn nicht, ist hier schon EIN Fehler.

    Ich nehme an, Du öffnest eine neue Datei mit "Neu\Vorlage xyz benutzen" oder so ähnlich?
    Vergiss nicht: Wenn Du Aenderungen am Code oder in Excel machst, musst Du die neue Datei immer abspeichern. Sonst sind die Aenderungen verloren, der ursprüngliche Code und die Datei selbst sind ja in dieser Vorlage und die hast Du nicht geändert. Am Ende, so Gott will, wird dann dia alte Vorlage durch die funktionierende neue Datei ersetzt.

    Berichte uns.

    Gruss Urs
     
  10. Hascheff

    Hascheff Moderator

    Urlaub muss sein. Wir haben uns schon schön die Zeit vertrieben.
    Jetzt haben wir die ganze Zeit in die Tiefen der Programmierung begeben und die einfachen Fragen vernachlässigt.
    Das hab ich doch schon ganz am Anfang getestet. Selbst wenn ein Bereich namens "Check20000" existiert, die Fehlermeldung kommt trotzdem.
    Könnte es eine Checkbox sein? Aber wer setzt denn eine Checkbox in eine Tabelle?
     
  11. Urs2

    Urs2 Megabyte

    @Hascheff
    Natürlich kommt sie trotzdem! Der Code stolpert ja nicht über einen unklaren Kopierort, sondern er weiss überhaupt nicht was er tun soll - er ist falsch! Ein funktionierender Code mit NamensBereich ist in #26.

    Mit den einfachen Fragen hast Du recht. Hier die absolute Grundfrage:
    Braucht es überhaupt VB-Code um die Arbeit zu verrichten? Ich denke Nein!

    In Excel und Word (das der TO ja kennt) kann man wunderbare Formulare erstellen, die man als Vorlage speichert und wo man die fehlenden Angaben dann in Felder eingeben kann. Man kann auch Eingaben vorgeben (z.B. Ja/Nein).
    Was meinst Du dazu?

    Gruss Urs
     
  12. Doctore IV

    Doctore IV Byte

    Ich denke ich bringe euch vorerst auf den Stand um was es sich bei der ganzen Tabelle überhaupt handelt.
    Die Tabelle besteht aus einem Datenblatt das zur Kabelauskunft dient, hier kann ich als Beschäftigter in einem Elektrounternehmen per Druck auf den Knopf "Ausfüllen" der als Makrofunktion arbeitet in einem Dialogfeld den Namen des Kunden, des Elektroinstallateurs etc. ausfüllen und auch einige Ja/Nein Funktionen auswählen.
    Bei dem durchversuchen der Funktionen der Tabelle stoße ich wie euch ja bekannt ist auf den Debuggen Fehler, allerdings füllen sich Daten wie Name/Installateur etc. automatisch in die Tabelle ein, wärend die Ja/Nein trotz neuer Angaben sich nicht rührt und unverändert bleibt.
    Alles was ich in der Tabelle mit 20 000 betitelt habe sind eine Ja/Nein Funktion 20 000-Volt Kabel und dann habe ich noch zwei 20 kV Ja/Nein Funktionen

    Ich würde raten das der Fehler hier begraben liegt....

    Gruß
    Doctore IV
     
  13. Urs2

    Urs2 Megabyte

    Scheint so zu sein.

    1. Im Excelblatt: Geh auf die Zelle wo der Wert von Check20000 erscheinen müsste. Wenn oben links im Fenster jetzt Check20000 erscheint, dann OK. Sonst musst Du die Zelle benamsen. Lass den Focus auf der genannten Zelle, dann im Menü Einfügen > Namen > Definieren. In der Box schreib zuoberst Check20000 dann OK.

    2. Im VB-Editor: Da Du die erste 0/1 Abfrage auf Hascheffs Vorschlag schon auskommentiert hattest, schreib darunter den folgenden neuen Code. Es müsste dann so aussehen (zuerst der auskommentierte alte und dann der über CopyPaste einzufügende neue Code):

    'If chb20000kv.Value = True Then
    'Application.ActiveSheet.Check20000 = 1
    'Else
    'Application.ActiveSheet.Check20000 = 0
    'End If
    Application.Goto Reference:="Check20000"
    Selection.Value = Abs(chb20000kv.Value)

    Dann zuerst Debuggen > Kompilieren und dann speichern.

    3. Wenn Du jetzt das Makroformular ausfüllst und ausführst, erscheint in der nächsten Codezeile wieder ein Fehler, ABER... im Tabellenblatt müsste jetzt bei Check20000 eine Null oder eine Eins stehen.

    4. Wenn das Resultat so ist, musst Du jetzt "nur" noch den Code aller Checkbox-Abfragen durch diese zwei neuen Zeilen ersetzen >
    In der ersten und zweiten Codezeile jeweils die Check... und chb... Angaben ersetzen und ggf der Zelle im Tabellenblatt einen Namen geben.

    Viel Spass...

    Gruss Urs
     
  14. Hascheff

    Hascheff Moderator

    @ Urs2: Ich lass dich jetzt mal machen und beobachte aus dem Hintergrund.
     
  15. Doctore IV

    Doctore IV Byte

    Nochmal langsam...leider weiß ich doch garnicht in welcher Zelle der Wert von Check20000 sein müsste. Wenn ich leider nicht weiß welche Zelle das ist wie kann ich sie dann betiteln?
    Habe jetzt ohne die Zelle zu betiteln den neuen Code mal eingesetzt, jetzt markiert er Application.Goto Reference:="Check20000"

    wie kann ich herausfinden welches feld ich Check20000 nennen soll?

    Gruß
    Doctore IV
     
  16. Urs2

    Urs2 Megabyte

    Wenn schon Du nicht weisst wohin der Wert geschrieben werden soll, woher soll ich denn das wissen?

    Du wirst doch sicher herausfinden können, wo auf Deinem Datenblatt dieser Wert erscheinen müsste! Wenn nicht, dann ...

    Gib zuerst mal irgendeiner Zelle auf dem Blatt den Namen Check20000, und zwar so wie ich es beschrieben hatte. Dann können wir sehen ob es funktioniert.

    Die benannte Zelle kannst Du später 10 mal um den Bildschirm ziehen bis sie dort ist, wo Du sie haben willst. Sie zieht ihren Namen automatisch mit.

    Gruss Urs
     
  17. Hascheff

    Hascheff Moderator

    Ich hab schon mal dran gedacht zu fragen, ob du uns mal dein Tabellenblatt zeigst, vielleicht auch nur als Screenshot. Ich weiß aber nicht, ob das betriebsgeheimnismäßig erlaubt ist. Es wäre deine Verantwortung.
     
  18. Doctore IV

    Doctore IV Byte

    Urs, es ist ein triumph, ich habe irgendeine Zeile Check20000 genannt und den Code wie von dir angegeben verändert, nun steht hier die vorhergesagte 0, muss ich jetzt unter jede Zeile den Anhang schreiben? also z.B.

    If chbSBKabel.Value = True Then
    Application.ActiveSheet.CheckSB = 1
    Else
    Application.ActiveSheet.CheckSB = 0
    End If
    Application.Goto Reference:="chbSBKabel"
    Selection.Value = Abs(chbSBKabel.Value)

    Hascheff, ich übrenehme gerne die Verantwortung und stelle jetzt auch direkt einen Screenshot meiner Tabelle online!

    Achja, ich bin jetzt zwei Wochen lang unterwegs, daher werde ich wohl falls ihr später als heute antwortet erst wieder am 5. März darauf eingehen können, also seit nicht sauer, wenn ihr erstmal nichts von mir hört!

    Gruß
    Doctore IV
     

    Attached Files:

  19. Urs2

    Urs2 Megabyte

    ...was glaubst Du wie ich froh bin, dass wir es noch knapp geschafft haben, ich hatte nämlich den Sommerurlaub schon gebucht...

    Was hatten wir doch spekuliert, wozu denn die Null/Eins verwendet werden könnten... Mit dem Screenshot ist jetzt auch das klar.

    Deine Denk-Richtung stimmt, aber nur die Richtung!

    1. Die erste hinzugefügte Zeile muss jeweils sinngemäss lauten:
    Application.Goto Reference:="CheckSB"

    Im Excelblatt musst Du aber auch jeweils einer Zelle den Namen "CheckSB" geben, oder sinngemäss für die anderen Boxen.

    Dann muss es funtionieren! Aber >

    2. Du darfst die zwei neuen Zeilen nicht "anhängen". Die neuen Zeilen ersetzen die alten Zeilen! Wenn Du die neuen geschrieben hast, musst Du die Zeilen von "If chb..." bis und mit "End If" löschen.

    3. Mein Vorschlag damit möglichst wenig Fehler entstehen und nichts vergessen bleibt:
    - Schreib die zwei neuen Zeilen unter die entsprechenden alten, so siehst Du die benötigten Aenderungs-Texte.
    - Dann erst lösch die oberen Zeilen von If... bis End If
    - Wenn keine If...End If mehr da sind, dann bist Du fertig.

    4. ...fast fertig: Unter diesem Sub steht ja noch ein weiteres Sub mit fast gleichem Inhalt!

    - Kopier den Inhalt des fertigen oberen Sub in das untere Sub.
    - Lösch alles was dort vorher stand
    - Im eben Hineinkopierten, lösch die beiden dort fast am Ende stehenden Zeilen:
    Worksheets("Tabelle1").Select
    ActiveWindow.SelectedSheets.PrintOut

    Fertig und berichte dann ob es funktioniert hatte...

    Gruss Urs
     
  20. Hascheff

    Hascheff Moderator

    also das sieht mir doch stark nach einer Checkbox aus.
    Doctore IV, mach mal einen Rechtsklick auf die Checkbox neben "20 000-Volt Kabel" und wähle aus dem Popup-Menü "Steuerelement formatieren...". Schau mal, was auf der Registerkarte "Steuerung" bei "Zellverknüpfung" steht. Die dort eingetragene Zelle muss Check20000 heißen.

    Und im Code muss dann stehen:

    'If chb20000kv.Value = True Then
    'Application.ActiveSheet.Check20000 = 1
    'Else
    'Application.ActiveSheet.Check20000 = 0
    'End If
    Application.Goto Reference:="Check20000"
    Selection.Value = chb20000kv.Value

    Wie ihr seht, habe ich Abs entfernt. Der Checkbox ist es nämlich gleich, ob in der Zelle +1 oder -1 steht. Und was in der Zelle wirklich steht, sieht man nicht. (Die Schriftfarbe ist weiß oder die Zelle liegt ganz woanders.)

    Wie Urs2 schreibt, musst du das jetzt für alle Checkboxen wiederholen und dann in die andere Prozedur kopieren.
     
Thread Status:
Not open for further replies.

Share This Page