PDA

Vollständige Version anzeigen : Laufzeitfehler 13, unverträgliche Typen


Quartzlurch
07.07.2014, 10:37
Hallo und guten Morgen an alle User,

habe seit kurzer Zeit ein Problem an meiner Tabelle mit dem VBA, es werden mir, wenn die Tabelle gesperrt ist, 2 Zeilen im Code aus unverständlichen Gründen der >Laufzeitfehler 13, unverträgliche Typen< angegeben. In entsperrtem Zustand läuft es reibungslos. Nur: am Anfang funktionierte es auch in gesperrtem Zustand. Wenn ich die beiden Zeilen mit >Rem< deaktiviere, dann funktioniert es. Hier mal der Code:

Sub Monatsabschluss()

Dim src As Worksheet, tar As Worksheet
Set src = Sheets("Belege")
Set tar = Sheets("Jahresbericht")

tar.Range("B4") = src.Range("J2") + tar.Range("B4")
tar.Range("C4") = src.Range("K2") + tar.Range("C4")
tar.Range("C9") = src.Range("K7") + tar.Range("C9")
tar.Range("C10") = src.Range("K8") + tar.Range("C10")
tar.Range("C12") = src.Range("K10") + tar.Range("C12")
tar.Range("C14") = src.Range("K12") + tar.Range("C14")
tar.Range("B17") = src.Range("J15") + tar.Range("B17")
tar.Range("C17") = src.Range("K15") + tar.Range("C17")
tar.Range("D17") = src.Range("L15")
tar.Range("D18") = src.Range("L16")
tar.Range("D19") = src.Range("L17")
tar.Range("D20") = src.Range("L18")
tar.Range("D22") = src.Range("L20")
tar.Range("D23") = src.Range("L21")
tar.Range("D24") = src.Range("L22")
tar.Range("D25") = src.Range("L23")
tar.Range("B18") = src.Range("J16") + tar.Range("B18")
tar.Range("C18") = src.Range("K16") + tar.Range("C18")
tar.Range("B19") = src.Range("J17") + tar.Range("B19")
tar.Range("C19") = src.Range("K17") + tar.Range("C19")
tar.Range("B20") = src.Range("J18") + tar.Range("B20")
tar.Range("C20") = src.Range("K18") + tar.Range("C20")
tar.Range("B22") = src.Range("J20") + tar.Range("B22")
tar.Range("C22") = src.Range("K20") + tar.Range("C22")
tar.Range("B23") = src.Range("J21") + tar.Range("B23")
tar.Range("C23") = src.Range("K21") + tar.Range("C23")
tar.Range("B24") = src.Range("J22") + tar.Range("B24")
tar.Range("C24") = src.Range("K22") + tar.Range("C24")
tar.Range("B25") = src.Range("J23") + tar.Range("B25")
tar.Range("C25") = src.Range("K23") + tar.Range("C25")
tar.Range("C27") = src.Range("K25") + tar.Range("C27")
tar.Range("C29") = src.Range("K27") + tar.Range("C29")
tar.Range("B31") = src.Range("J29") + tar.Range("B31")
tar.Range("B33") = src.Range("J31") + tar.Range("B33")
tar.Range("B35") = src.Range("J33") + tar.Range("B35")
tar.Range("B37") = src.Range("J35") + tar.Range("B37")
tar.Range("C37") = src.Range("K35") + tar.Range("C37")
tar.Range("D37") = src.Range("L35") + tar.Range("D37")
tar.Range("C41") = src.Range("K39") + tar.Range("C41")
tar.Range("C42") = src.Range("K40") + tar.Range("C42")
tar.Range("C43") = src.Range("K41") + tar.Range("C43")
tar.Range("C44") = src.Range("K42") + tar.Range("C44")
tar.Range("C45") = src.Range("K43") + tar.Range("C45")
Dim Dateiname As String
Dateiname = "Monat_Januar 2014"
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Application.ActivePrinter = "Foxit Reader PDF Printer auf Ne03:"
ActiveWindow.SelectedSheets.PrintOut From:=InputBox("Druck ab Seite Nummer:", "Erste Druckseite"), To:=InputBox("Druck bis Seite Nummer:", "Letzte Druckseite"), Copies:=1, _
ActivePrinter:="Foxit Reader PDF Printer auf Ne03:", Collate:=True

End Sub


Wäre schön, wenn ihr mir helfen könntet, ich suche und probiere schon seit 2 Tagen aus und habe überlegt, ob es Sinn macht noch ein Makro zum sperren und entsperren einzubauen, aber normalerweise müsste es doch so gehen, Also wo liegt der Fehler?

Gruß Horst

aloys78
07.07.2014, 10:47
Hallo Horst,

sind denn die Daten in den beteiligten Zellen numerisch ?

Gruß
Aloys

Quartzlurch
07.07.2014, 10:53
Hallo Aloys,

meinst Du die Formatierung? Die sind formatiert mit Währung und 2 Kommastellen.

Gruß Horst

chris-kaiser
07.07.2014, 11:04
Hi,

tar.Range("C17").value = val(src.Range("K15").value) + val(tar.Range("C17").value) 'wobei Val nur Ganzzahlen nehmen würde.... wenn du Komma hast bringt das nichts

oder

tar.Range("C17").value =worksheetfunction.sum(tar.Range("C17").value, src.Range("K15").value)

du hast da was "leeres" oder einen Text in den Zellen stehen.
das mag das + nicht :), wenn jetzt noch ein Text in den Zellen steht, kommt eine Meldung mit worksheetfunction.sum kann nicht zugeordnet werden.

entweder den Code erweitern indem du abfragst ob auch wirklich eine Zahl in den Zellen steht.
Oder manuell die Zellwerte auf Zahl bringen!

Quartzlurch
07.07.2014, 11:37
HI Chris,

ich habe das gerade nochmal überprüft. Die Zelle "K15" beinhaltet einen, durch eine Formel berechneten Wert, der durch das Makro in ein anderes Tabellenblatt in die Zelle "B17" als Wert eingefügt wird. Beide Zellen sind als Währung mit 2 Kommastellen formatiert und es ist kein Text enthalten. Ohne Sperrung funktioniert alles reibungslos, sobald die Sperrung aktiv ist hält VBA an und gibt die Fehlermeldung aus. Das gleiche Problem bei der 2. rot markierten Zeile im Code. Bin echt ratlos!

Gruß Horst

chris-kaiser
07.07.2014, 11:45
Hi,

welche Sperrung?
Blattschutz?

wenn ja, von den Zellen den Schutz entfernen, oder den Schutz mit dem parameter Userinterfaceonly:=true versehen.

nur wenn Laufzeitfehler 13 kommt, ist da etwas in den Zellen was nicht als Zahl erkannt wird.

Mache eine Kopie der Mappe, lösche ALLES raus bis auf dieses Zellen und hänge die Mappe mal an.
:)

Quartzlurch
07.07.2014, 12:13
Hallo Chris,

anbei die Datei und ja, ich meinte Blattsperrung.

Gruß Horst

Mc Santa
07.07.2014, 12:22
Hallo,

mal zwischendrin eine Idee für Modul4:
Sub Belege_auf_Monatsbeginn()

Dim src As Worksheet, tar As Worksheet
Set tar = Sheets("Belege")

Rem Nullstellung der Kassenbelege!

tar.Range("B2:F100") = ""

Rem Nullstellung der Lieferanten!

tar.Range("P2:U100") = ""

Rem Nullstellung der Provisionen!

tar.Range("Y2:AD100") = ""

Rem Nullstellung der Monatsübersicht
'(Orange eingerahmte Felder)!

tar.Range("J15:J18") = ""
tar.Range("J20:J23") = ""

tar.Range("L15:M18") = ""
tar.Range("L20:M23") = ""

tar.Range("K39") = ""
End Sub

VG

Quartzlurch
07.07.2014, 12:40
Hallo Mc Santa,

hatte dich schon vermisst, und dachte schon, dass ich dich etwas genervt habe mit meinen Fragen?

Gute Idee mit der Bereichsangabe, danke schön. Bin da immer ein wenig unsicher wo das geht bzw. wie. Da bin ich ganz ehrlich. Werde ich auf alle Fälle analog ändern, kannst dir vielleicht vorstellen, wie lange ich damit beschäftigt war. Danke nochmals!

chris-kaiser
07.07.2014, 12:41
Hi,

die anderen Zellen sind ohne Schutz, Zelle C17 ist gesperrt deshalb der Fehler.

wenn ja, von den Zellen den Schutz entfernen, oder den Schutz mit dem parameter Userinterfaceonly:=true versehen.

Ich würde das ja gleich mal in deine Mappe einbauen, nur ist bei deinem Blatt ein Passwort hinterlegt.

du könntest bei Workbook_open in "dieseArbeitsmappe"

Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In Worksheets
sh.Protect "DEIN_PW", Userinterfaceonly:=True
Next
End Sub


diesen Code eingeben, PASSWORT anpassen.
dann würde das Makro auch gesperrte Zellen aktualisieren.
(Nachdem du die Mappe einmal gespeichert und wieder geöffnet hast)

Quartzlurch
07.07.2014, 12:46
Hi,

die anderen Zellen sind ohne Schutz, Zelle C17 ist gesperrt deshalb der Fehler.



Ich würde das ja gleich mal in deine Mappe einbauen, nur ist bei deinem Blatt ein Passwort hinterlegt.

du könntest bei Workbook_open in "dieseArbeitsmappe"

Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In Worksheets
sh.Protect "DEIN_PW", Userinterfaceonly:=True
Next
End Sub


diesen Code eingeben, PASSWORT anpassen.
dann würde das Makro auch gesperrte Zellen aktualisieren.
(Nachdem du die Mappe einmal gespeichert und wieder geöffnet hast)
HI Chris,

wo muss denn der Code eingefügt werden, in eines der Module oder in die persönliche? Was meinst Du mit "die anderen Zellen sind offen"? Zum Bsp. die Zelle "K15" ist gesperrt genau wie die Zelle "C17", da müsste ich mich wirklich wundern wenn nicht. Aber der Teufel ist ein Eichhörnchen!

chris-kaiser
07.07.2014, 12:48
Hi,

... habe ich doch geschrieben :)

du könntest bei Workbook_open in "dieseArbeitsmappe"

Quartzlurch
07.07.2014, 12:53
Hallo Chris,

hab's kapiert, sorry, bin etwas verwirrt wegen dem VBA-Stress ;-)

Quartzlurch
07.07.2014, 17:19
Hallo,

mal zwischendrin eine Idee für Modul4:
Sub Belege_auf_Monatsbeginn()

Dim src As Worksheet, tar As Worksheet
Set tar = Sheets("Belege")

Rem Nullstellung der Kassenbelege!

tar.Range("B2:F100") = ""

Rem Nullstellung der Lieferanten!

tar.Range("P2:U100") = ""

Rem Nullstellung der Provisionen!

tar.Range("Y2:AD100") = ""

Rem Nullstellung der Monatsübersicht
'(Orange eingerahmte Felder)!

tar.Range("J15:J18") = ""
tar.Range("J20:J23") = ""

tar.Range("L15:M18") = ""
tar.Range("L20:M23") = ""

tar.Range("K39") = ""
End Sub

VG
Hallo Mc Santa,

habe deine Optimierung des Codes entsprechen eingesetzt, Super, hat mir noch 'ne Menge Arbeit erspart. Ein großes Danke!!!

Gruß Horst

Quartzlurch
07.07.2014, 17:27
Hi,

... habe ich doch geschrieben :)
Hallo Chris,

hat wunderbar geklappt mit deinem Code, Super!!! Eine Sache würde ich noch gerne optimieren, wenn das möglich ist: wenn der Button >Monatsabschluss< ausgelöst wird und es sind im Tabellenblatt >Belege< keine Daten zum kopieren vorhanden, dann meldet sich der VBA wieder und hält den ganzen Prozess an. Kann man da nicht eine Abfrage und/oder eine Routine einbauen, mit dem Hinweis: "keine Daten vorhanden"?

Gruß Horst

Quartzlurch
07.07.2014, 17:46
Hallo an das Forum,

habe da nochmal ein Problem(chen) mit folgendem stark verkürzten Code:

Sub Monatsabschluss()

Dim src As Worksheet, tar As Worksheet
Set src = Sheets("Belege")
Set tar = Sheets("Jahresbericht")

tar.Range("B4") = src.Range("J2") + tar.Range("B4")
tar.Range("C4") = src.Range("K2") + tar.Range("C4")
tar.Range("C9") = src.Range("K7") + tar.Range("C9")
tar.Range("C44") = src.Range("K42") + tar.Range("C44")
tar.Range("C45") = src.Range("K43") + tar.Range("C45")
Dim Dateiname As String
Dateiname = "Monat_Januar 2014"
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Application.ActivePrinter = "Foxit Reader PDF Printer auf Ne03:"
ActiveWindow.SelectedSheets.PrintOut From:=InputBox("Druck ab Seite Nummer:", "Erste Druckseite"), To:=InputBox("Druck bis Seite Nummer:", "Letzte Druckseite"), Copies:=1, _
ActivePrinter:="Foxit Reader PDF Printer auf Ne03:", Collate:=True


Wenn ich das Makro ausgelöst habe und ich auf abbrechen drücke kann ich nur noch über den Makro-Stop VBA aussteigen, es erscheint die Fehlermeldung: "Laufzeitfehler 1004, die Methode "Printout" für das Projekt "Sheets" ist fehlgeschlagen". Ich hätte da ganz gerne eine elegantere Lösung, wenn möglich. Am liebsten wäre mir, dass nach erfolgtem Abbruch "vielleicht durch eine Abfrage im Code?" Excel direkt wieder auf die Seite springt in der das Makro ausgelöst wurde, geht sowas?

Gruß und Tausend Dank im Voraus, ihr habt mir bisher sehr geholfen!!!

Horst

Quartzlurch
07.07.2014, 21:58
Hallo Forum,

habe hier eine Idee um die Fehlermeldung "Laufzeitfehler 1004, die Methode "Printout" für das Projekt "Sheets" ist fehlgeschlagen", beim Abbruch des PDF-Ausdruckes durch Excel, durch eine MsgBox abzufangen und damit die Fehlermeldung durch VBA zu vermeiden. Hier der Code mit der Bitte mal drüberzuschauen und wenn nötig zu verbessern bzw. lauffähig zu machen:

On Error GoTo fehler
Application.ActivePrinter = "Foxit Reader PDF Printer auf Ne03:"
ActiveWindow.SelectedSheets.PrintOut From:=InputBox("Druck ab Seite Nummer:", "Erste Druckseite"), To:=InputBox("Druck bis Seite Nummer:", "Letzte Druckseite"), Copies:=1, _
ActivePrinter:="Foxit Reader PDF Printer auf Ne03:", Collate:=True
Exit Sub
fehler: MsgBox "PDF-Dokument wird nicht erstellt", _
vbCritical + vbOKOnly, "Fehler"

End Sub

Gruß Horst

Quartzlurch
08.07.2014, 05:59
Guten Morgen an alle User,

was meint ihr zu dem Code nach >Abbruch - PDF-Dokument< ist der Code logisch aufgebaut, hab'ein bisschen Schiss, dass ich mir an meinem Arbeitsblatt was kaputt mache, wenn ich's einfach ausprobiere, ohne zu wissen was passiert. Könnt ihr euch den Code bitte mal anschauen und eventuell anpassen?

Gruß Horst

chris-kaiser
08.07.2014, 06:14
Guten Morgen Horst,

Hättest du eine Demomappe mit jetzigen Stand. Dann schaue ich mal darüber.

In der Mappe bitte alle Personen- Firmenbezogenen Daten entfernen (oder durch Dummytexte ersetzen). Hebe den Blattschutz mit deinem jetzigen Password auf und verwende mal "xxx" als Password.

Quartzlurch
08.07.2014, 06:23
Guten Morgen Chris,

bin auf'm Sprung, muss gerade außer Haus, ich stelle dir später eine Tabelle rein. Ich denke das wird so gegen 10:30 sein. Bis später und danke :-)

Gruß Horst

Quartzlurch
08.07.2014, 08:53
Hallo Chris,

habe das Problem doch noch gelöst, der Code, wie oben beschrieben, funktioniert. Danke nochmal :-)

chris-kaiser
08.07.2014, 08:55
Hi,

Ok, :) gut wenn es passt!
freut mich.

Quartzlurch
08.07.2014, 12:15
Guten Morgen Horst,

Hättest du eine Demomappe mit jetzigen Stand. Dann schaue ich mal darüber.

In der Mappe bitte alle Personen- Firmenbezogenen Daten entfernen (oder durch Dummytexte ersetzen). Hebe den Blattschutz mit deinem jetzigen Password auf und verwende mal "xxx" als Password.
Hallo Chris,

hätte da noch 'n anderes Problem, das ich leider nicht in der Lage bin zu lösen. Ich möchte gerne, wenn keine Datensätze vorhanden sind bei starten des Makros die Meldung durch eine Msg-Box, "Es sind keine Daten vorhanden" und der Druckvorgang soll abgebrochen werden. Hier der Code zum Ausdruck der Bereiche "Druck bis zur letzten Zeile":

Sub Druck1()
Dim lngZeile As Long
With Worksheets("Belege")
For lngZeile = 2 To 100 Step 56
If .Range("b" & lngZeile) = "" Then
Exit For
End If
Next 'lngZeile
lngZeile = lngZeile - 1
.PageSetup.PrintArea = "a1:h" & lngZeile
.PrintOut
.PageSetup.PrintArea = Cells.Address
End With
End Sub

Anbei eine Beispiel Datei.

Gruß Horst

chris-kaiser
08.07.2014, 12:54
Hi,

würde es so in der Art machen

Sub Druck1()
Dim lngZeile As Long
With Worksheets("Belege")
'wenn was in Beschreibung steht dann drucke :)
lngZeile = .Cells(.Rows.Count, 2).End(xlUp).Row
If .Cells(.Rows.Count, 2).End(xlUp).Row > 1 Then
.PageSetup.PrintArea = "A1:h" & lngZeile
.PrintOut
.PageSetup.PrintArea = ""
Else
MsgBox "keine Daten zum Drucken vorhanden"
End If
End With
End Sub

Quartzlurch
08.07.2014, 13:00
HI Chris,

danke dir für deine Hilfe, ich kann's erst später ausprobieren. Melde mich später wieder.

Gruß Horst

Quartzlurch
08.07.2014, 13:32
HI Chris klappt vorzüglich, da macht das arbeiten Spaß! Hast Du noch 'ne Idee, wie ich beim Druck vom Tabellenblatt den Header auf die nachfolgenden Blätter übertragen kann?

Gruß Horst

chris-kaiser
08.07.2014, 13:47
Hi,

meinst du die este Zeile mit lfd.Nr. Beschreibung usw..
Das geht ohne VBA auch-> Seitenlayout -> Drucktitel -> Wiederholungszeilen oben -> Zeile 1 anklicken.

im Code würde das so aussehen

Sub Druck1()
Dim lngZeile As Long
With Worksheets("Belege")
'wenn was in Beschreibung steht dann drucke :)
lngZeile = .Cells(.Rows.Count, 2).End(xlUp).Row
If .Cells(.Rows.Count, 2).End(xlUp).Row > 1 Then
.PageSetup.PrintArea = "A1:h" & lngZeile
.PageSetup.PrintTitleRows = "$1:$1"
.PrintOut
.PageSetup.PrintArea = ""
Else
MsgBox "keine Daten zum Drucken vorhanden"
End If
End With
End Sub

Quartzlurch
08.07.2014, 13:57
HI Chris,

funktioniert tadellos. Danke euch allen, die mir halfen. Ihr seid ganz große Klasse ;-)

Gruß Horst