Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
664to668
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
664to668
664to668
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Wert aus Zelle auslesen
13.09.2005 14:40:23
Beate
Hallo Spezialisten!
ICh habe ein kleines Problem - vielleicht kann mir jemand helfen?
Ich habe einen code ,der es ermöglicht ein pdf zu drucken. Die Daten für das Verzeichnis sowie den Dateinamen entnimmt er aus einer Zelle.
Wenn in der Zelle, wo der Dateiname angeführt ist ein "," (Beistrich) steht, so bekomme ich die Fehlermeldung "400" zb. Angebot_Huberstraße 27, 12256 Reuters
Was kann ich tun, damit auch Beistriche akzeptiert werden?
Vielen DANK
BEATE
'Pfad der Mappe extrahieren
strFileToPrintPath = Worksheets("Tabelle1").Cells(2, 2).Text & "\"
'Dann wechsle vorher in den Pfad der Datei
ChDrive (Left(strFileToPrintPath, 2))
ChDir strFileToPrintPath
'Zur druckender: Mappenname_Tabelle1
strFilename = Worksheets("Tabelle1").Cells(2, 1).Text

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wert aus Zelle auslesen
13.09.2005 15:00:20
Rolf
Hallo Beate,
If Range("B1").PrefixCharacter = "'" Then...
hg
Rolf
AW: Wert aus Zelle auslesen
13.09.2005 15:26:18
Beate
Hallo Rolf!
Vielen Dank für Deine rasche Hilfe.
Leider bin ich kein superprofi, was VBA anlangt - bei meinem code hat mir nämlich jmd geholfen.
Kannst Du mir vielleicht sagen, wo ich Deine Zeile in meinen Code einfügen muß und wie ich ergänzen muss.
Wäre sehr nett.
Vielen Dank
Liebe Grüße
Beate
AW: Wert aus Zelle auslesen-Hilfe
13.09.2005 16:59:23
Beate
-
AW: Wert aus Zelle auslesen-Hilfe
13.09.2005 17:46:42
Rolf
Hallo Beate,
mach doch bitte mal ein oder zwei Beispiele,
was in der Zelle steht und was eigentlich stehen müßte.
fG
Rolf
AW: Wert aus Zelle auslesen-Hilfe
13.09.2005 18:19:15
Beate
Hallo Rolf!
Leider wie gesagt bin ich nicht wirklich gut in VBA - ich verstehe ungefähr was die Zeilen bedeuten. Den Präfix-Befehl habe ich zum ersten Mal gelesen.
Leider bin ich nicht in der ein Beispiel zu schreiben.
Vielleicht bist Du trotzdem so nett und ganz mir helfen.
Vielen Dank.
Beate
Anzeige
AW: Wert aus Zelle auslesen-Hilfe
13.09.2005 21:16:01
Rolf
Hallo Beate,
würde ich ja gern, aber ich bin nicht sicher,
ob ich das Problem richtig verstehe.
In deiner Zelle A2 steht ein String,
in dem ein Komma vorkommt. Heißt nun die Datei
tatsächlich "Angebot_Huberstraße 27, 12256 Reuters"
oder kommt das Komma im "echten" Dateinamen nicht vor?
Vielleicht postet du mal die komplette Prozedur.
hG
Rolf
AW: Wert aus Zelle auslesen-Hilfe
14.09.2005 08:22:57
Beate
Hallo Rolf!
Vielen Dank für Deine nette Antwort.
Ja es ist so in der Tat. In Zelle A2 steht der Dateiname und der soll dann, natürlich immer anders, deshalb bezogen auf die Zelle . zB "Angebot_Huberstraße 27, 12256 Reuters" - der Dateiname soll dann auch so heissen.
Hab es normal mit PDF-Drucken probiert - dabei wird der Name mit Beistrich akzeptiert - nur wenn ich, wie gewünscht die Daten aus der Zelle beziehe, dann schreibt er mit immer den Fehler "400".
Vielleicht hast DU ja eine Idee wie ich Problem in den Griff bekommen kann.
Vielen Dank für Deine Mühe
Liebe Grüße
Beate
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************
Option Explicit
'Liest alle unter dem aktuell angemeldeten Benutzer
'installierten Drucker aus
Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" ( _
ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" ( _
ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long
Private Declare Function GetActiveWindow Lib "user32.dll" () As Long
Private Const MAX_PATH = 260&
Private Const SW_MAXIMIZE = 3&
Private Const MAX_PRINTERS = 16
Private strPrinterNames(MAX_PRINTERS) As String
Private strPrinterDrivers(MAX_PRINTERS) As String
Private strPrinterPorts(MAX_PRINTERS) As String
Private intPrinterCount As Integer
Sub Start_Print()

'Druckt die übergebene Tabelle als PDF-Datei
'in das aktuelle Verzeichnis wo die Mappe gespeichert ist
Call Print_to_PDF(ActiveSheet)
End Sub
Public Sub Print_to_PDF(tarWks As Worksheet)

'*********************************
'Verweise setzen auf
'Microsoft Office 10.0 / 11.0 Object Library und
'Acrobat Distiller
'*********************************
'Zusätzlich wird das Klassenmodul classAcroDist benötigt
Dim myAdobeDist As classAcroDist 'see class module
Dim myWB As Workbook
Dim strFilename As String
Dim strFileToPrintPath As String
Dim DistInputPS As String
Dim DistOutputPDF As String
Dim DistJobOptions As String
Dim oldActivePrinter As String
Set myAdobeDist = New classAcroDist
'Distiller ausgeblendet startetn
myAdobeDist.myAdobeDist.bShowWindow = False
'Alle aktuellen Printjobs des Distillers stoppen
myAdobeDist.myAdobeDist.bSpoolJobs = False
'Alten Drucker aufnehmen
oldActivePrinter = Application.ActivePrinter
'Workbook zuweisen
Set myWB = Workbooks(tarWks.Parent.Name)
'Pfad der Mappe extrahieren
strFileToPrintPath = Worksheets("Tabelle1").Cells(2, 2).Text & "\"
'Dann wechsle vorher in den Pfad der Datei
ChDrive (Left(strFileToPrintPath, 2))
ChDir strFileToPrintPath
'Zur druckender: Mappenname_Tabelle1
strFilename = Worksheets("Tabelle1").Cells(2, 1).Text
'EXCEL kann nur PS-Files direkt drucken
'daher muss sowohl PS-File wie auch PDF-File definiert werden
DistInputPS = strFileToPrintPath & strFilename & ".ps"
DistOutputPDF = strFileToPrintPath & strFilename & ".pdf"
'Der Druckername wird automatisch ermittelt
'in der Funktion "Get_Adobe_Printer"
myWB.PrintOut ActivePrinter:=Get_Adobe_Printer, prtoFilename:=DistInputPS, PrintToFile:=True
'Dem Distiller das PS-File zum konvertieren übergeben
Call myAdobeDist.myAdobeDist.FileToPDF(DistInputPS, DistOutputPDF, DistJobOptions)
'Schauen wie lange er braucht
'und STatus OK meldet
Do While Not myAdobeDist.blnFinished
DoEvents
Loop
If myAdobeDist.blnFinished Then
MsgBox "PDF Printjob erfolgreich beendet"
Else
MsgBox "Fehler beim Druck in PDF Datei aufgetreten"
End If
Call Open_PDF(strFileToPrintPath, strFilename & ".pdf")
'Alten Drucker wieder herstellen
Application.ActivePrinter = oldActivePrinter
'Variablen leeren
Set myAdobeDist = Nothing
End Sub
Function Get_Adobe_Printer() As String
'Adobe Drucker bestimmen
Dim strBuffer As String
Dim intIndex As Integer
strBuffer = Space$(8192)
GetProfileString "PrinterPorts", vbNullString, "", strBuffer, Len(strBuffer)
prcGetPrinterNames strBuffer
prcGetPrinterPorts
For intIndex = 0 To intPrinterCount
If InStr(1, strPrinterNames(intIndex), "Adobe") > 0 Then
'Genaue Druckerbezeicnung übergeben
Get_Adobe_Printer = strPrinterNames(intIndex) & " auf " & strPrinterPorts(intIndex)
Exit For
End If
Next
End Function

Private Sub prcGetPrinterNames(ByVal strBuffer As String)
Dim intIndex As Integer
Dim strName As String
intPrinterCount = 0
Do
intIndex = InStr(strBuffer, Chr(0))
If intIndex > 0 Then
strName = Left$(strBuffer, intIndex - 1)
If Len(Trim$(strName)) > 0 Then
strPrinterNames(intPrinterCount) = Trim$(strName)
intPrinterCount = intPrinterCount + 1
End If
strBuffer = Mid$(strBuffer, intIndex + 1)
Else
If Len(Trim$(strBuffer)) > 0 Then
strPrinterNames(intPrinterCount) = Trim$(strBuffer)
intPrinterCount = intPrinterCount + 1
End If
strBuffer = ""
End If
Loop While (intIndex > 0) And (intPrinterCount < MAX_PRINTERS)
End Sub


Private Sub prcGetPrinterPorts()
Dim strBuffer As String
Dim intIndex As Integer
For intIndex = 0 To intPrinterCount - 1
strBuffer = Space$(1024)
Debug.Print GetProfileString("PrinterPorts", strPrinterNames(intIndex), "", strBuffer, Len(strBuffer))
GetProfileString "PrinterPorts", strPrinterNames(intIndex), "", strBuffer, Len(strBuffer)
prcGetDriverAndPort strBuffer, strPrinterPorts(intIndex)
Next
End Sub


Private Sub prcGetDriverAndPort(ByVal Buffer As String, PrinterPort As String)
Dim intDriver As Integer
Dim intPort As Integer
PrinterPort = ""
intDriver = InStr(Buffer, ",")
If intDriver > 0 Then
intPort = InStr(intDriver + 1, Buffer, ",")
If intPort > 0 Then
PrinterPort = Mid$(Buffer, intDriver + 1, intPort - intDriver - 1)
Debug.Print PrinterPort
End If
End If
End Sub

Sub Open_PDF(strPath As String, strFile As String)

Dim strShortPath As String
strShortPath = Space(MAX_PATH)
GetShortPathName strPath & strFile, strShortPath, MAX_PATH
strShortPath = Left$(strShortPath, InStr(1, strShortPath, vbNullChar) - 1)
ShellExecute GetActiveWindow, "open", strShortPath, "", strPath, SW_MAXIMIZE
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub



Anzeige
@Nepumuk -Code?
14.09.2005 08:40:39
Rolf
Hallo Beate, hallo Nepumuk,
der Code trägt ziemlich eindeutig Nepumuks Handschrift -
wäre schön, lieber Max, wenn du mal deinen Senf dazu gäbst.
Ich schau zwar mal, kann aber nichts versprechen.
hG
Rolf
AW: Wert aus Zelle auslesen-Hilfe
14.09.2005 16:43:28
Rolf
Hallo Beate,
als Notlösung könntest du den Bei- durch einen Unterstrich ersetzen

Sub Print_to_PDF(tarWks As Worksheet)
statt
strFilename = Worksheets("Tabelle1").Cells(2, 1).Text
z.B.
With Worksheets("Tabelle1").Range("A2")
If InStr(.Formula, ",") > 0 Then
.Replace What:=",", Replacement:="_"
strFilename = .Formula
Else
strFilename = .Formula
End If
End With
End Sub

Wenn du den Code des Klassenmoduls mal postest,
fällt mir vielleicht noch 'was Besseres ein.
hG
Rolf
Anzeige
AW: Wert aus Zelle auslesen-Hilfe
14.09.2005 20:11:56
Beate
Hallo Rolf!
Das ist ja wirklich sehr nett von Dir, dass Du Dir soviel Mühe machst.
VIelen Dank für Deinen Code - die Lösung ist auch o.k. aber wenn Du was besseres hast, freut mich das natürlich auch sehr.
Gibt es eigentlich eine logische Erklärung warum unter dem selben Namen problemlos ein pdf erstellen kann und wenn ich es aus der Zeile auslese dann funktioniert es nicht?
Vielen Dank nochmal.
Liebe Grüße von Beate
Hier ist der Code des Klassenmoduls
Option Explicit
Public WithEvents myAdobeDist As PdfDistiller
Public blnFinished As Boolean

Private Sub Class_Initialize()
Set myAdobeDist = New PdfDistiller
End Sub


Private Sub myAdobedist_OnJobDone(ByVal strInputPostScript As String, ByVal strOutputPDF As String)
blnFinished = True
'Altes PS-File löschen
Kill strInputPostScript
'Distiller Log Datei löschen
Kill Left(strInputPostScript, Len(strInputPostScript) - 3) & ".log"
End Sub


Private Sub myAdobedist_OnJobFail(ByVal strInputPostScript As String, ByVal strOutputPDF As String)
blnFinished = True
End Sub


Private Sub myAdobedist_OnJobStart(ByVal strInputPostScript As String, ByVal strOutputPDF As String)
blnFinished = False
End Sub

Anzeige
Komma in PostScript-Dateinamen
15.09.2005 10:25:48
Rolf
Hallo Beate,
hier mal ein Expertenzitat:
"...Normalerweise darf das Komma in allen Microsoft-Betriebssystemen in Verzeichnis- und Dateinamen vorkommen. Unter Windows NT, 2000 und XP kann der Druckertreiber keine Postscript-Datei erzeugen, wenn das Verzeichnis oder der Dateiname ein Komma enthält. Sie müssen einen Namen ohne Komma wählen. Bei Windows 95, 98 und ME tritt das Problem nicht auf...."
So wird die Not- vermutlich zur Dauerlösung.
Nachfolgend mal meine Schmalspurversion,
die für dich, falls sie dir reicht,
vielleicht ein bisschen leichter zu pflegen ist.
Herzliche Grüße
Rolf
PS
Die Forumsbeates treten halt besonders sympathisch auf
Option Explicit
Private Declare

Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub druck_pdf()
Dim pdfDist As PdfDistiller                     'Verweis auf "Acrobat Distiller" setzen
Dim strPrt As String, strFolder As String, strFile As String
Dim strPSFile As String, strPDFFile As String
Dim RetVal As Integer
Set pdfDist = New PdfDistiller
strPrt = "Acrobat Distiller auf Ne02:"          'musst du anpassen
strFolder = Range("B2").Formula                 'Zielverzeichnis: zB "C:\Eigene Dateien\"
strFile = Range("A2").Formula
With Worksheets("Tabelle1").Range("A2")         'Zieldatei:   aus zB "Be,ate" wird dann..
If InStr(.Formula, ",") > 0 Then
.Replace What:=",", Replacement:="_"                  '..."Be_ate"
strFile = .Formula
Else
strFile = .Formula
End If
End With
strPSFile = strFile & ".ps"
strPDFFile = strFile & ".pdf"
ChDrive strFolder
ChDir strFolder
ActiveWindow.SelectedSheets.PrintOut ActivePrinter:=strPrt, _
prtofilename:=strFolder & strPSFile, printtofile:=True
pdfDist.FileToPDF strFolder & strPSFile, strFolder & strPDFFile, ""
Kill strFolder & strPSFile
RetVal = MsgBox("Datei drucken", vbYesNo)
If RetVal = 7 Then Exit Sub
ShellExecute 0, "Print", strFolder & strPDFFile, "", "", 0
End Sub

Anzeige
AW: Komma in PostScript-Dateinamen
16.09.2005 14:03:18
Beate
hallo Rolf!
Das war wirklich sehr lieb von Dir, dass Du mir da geholfen hast - ich hab´s nun auf meine Bedürfnisse modifiziert und funktioniert ohne Probleme.
Viele Dank nochmal!
Liebe Grüße schickt DIr Beate

341 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige