Nyomtatási sor nevek megadása

Nyomtatási sor nevek megadása
2004-03-07T23:33:36+01:00
2004-03-10T23:10:27+01:00
2022-10-19T09:45:42+02:00
fuxypapa
Üdv Mindenkinek,
a következő probléma merült fel az imént, melyre nem tudom van-e egyáltalán megoldás. Adott egy Excel xls fájl, benne 20 db munkalap, ebből 15 munkalapot ki kell nyomtatni (kb 100 oldal), a többi a kimutatásdiagrammokhoz szolgáló tábla adatbázis. szeretnék pdf-be nyomtatni acrobat-tal. DE! minden egyes munkalapot külön nyomtat fájlba (ha kijelölöm az összes nyomtatandó munkalapot, akkor is). ez azért baj, mert acrobat-unk megkérdezi a mentendő pdf fájlnevét ami ugyebár az excel által a nyomtatóra küldött dokumentum, melyek a nyomtatási sorba egyforma névként jelennek meg. van-e olyan lehetőség,, hogy a szerencsétlen excel a munkalapok neveit külgye ki, mint nyomtatási név. mindezekez makróba raktam, csak a név ami egyforma, tehát nem tudom tejesen automatizálni. mostanában elég sokszor változnak a táblázatok, igy nem mindegy mennyi idő a dokumentálás.
minden választ előre is köszönök
üdv
fuxipapa
Mutasd a teljes hozzászólást!
A csúnya, de talán működö megoldás: a cikluson belül használj SaveAS-t a PrintOut elött....
Mutasd a teljes hozzászólást!

  • Windows GDI

    StartDoc
    The StartDoc function starts a print job.

    int StartDoc(
    HDC hdc, // handle to DC
    CONST DOCINFO* lpdi // contains file names
    );


    Erre keress rá az APiviewerrel,
    DOCINFO
    The DOCINFO structure contains the input and output file names and other information used by the StartDoc function.

    typedef struct {
    int cbSize;
    LPCTSTR lpszDocName;
    LPCTSTR lpszOutput;
    LPCTSTR lpszDatatype;
    DWORD fwType;
    } DOCINFO, *LPDOCINFO;
    Members
    cbSize
    Specifies the size, in bytes, of the structure.
    lpszDocName
    Pointer to a null-terminated string that specifies the name of the document.
    lpszOutput
    Pointer to a null-terminated string that specifies the name of an output file. If this pointer is NULL, the output will be sent to the device identified by the device context handle that was passed to the StartDoc function.
    lpszDatatype
    Pointer to a null-terminated string that specifies the type of data, such as "raw" or "emf", used to record the print job. This member can be NULL. Note that the requested data type might be ignored.
    fwType
    Specifies additional information about the print job. This member must be zero or one of the following values.


    a lpszOutput-ban állíthatod a nevet.Bővebben az MSDN-en
    Mutasd a teljes hozzászólást!
  • Köszönöm tibuD,
    csak az a baj én építész vagyok...hehe, a Delphi még menne...
    ezt lehet valahogy az excel nyomtatásakor kontrolálni, modnjuk a vbs script-en keresztül? az még menne valahogy.
    Vagy miután kiküldtem nyomtatásra, utána DOCINFO-val megváltoztatom? a baj ebben az esetben hogy az acrobat azonnal kérdezi a fájlnevet. de azért megpróbálom használni valahogy
    köszönöm mégegyszer
    üdv.
    fuxi
    Mutasd a teljes hozzászólást!
  • Bocs, nem gondolkodtam...:(
    Amit írtam nem igazán Excel-hez való.
    Próbáld addig a PrintOut() methodot.
    Elvileg rákérdez a névre. Most sajnos dolgoznom kell, de ha estig nem kapsz értékelhető választ akkor majd otthon megnézem.
    Mutasd a teljes hozzászólást!
  • Üdv tibuD,
    azzal nyomtataok, a kód valahogy igy néz ki:


    Dim i As Integer Dim msgString As String Dim PrintArray(15, 0) As String PrintArray(0, 0) = "1.sz - KÖZÖS TULAJDON" PrintArray(1, 0) = "2a.sz - A LÉPCSÖHÁZ" PrintArray(2, 0) = "2b.sz - B LÉPCSÖHÁZ" PrintArray(3, 0) = "2c.sz - C LÉPCSÖHÁZ" PrintArray(4, 0) = "2d.sz - D LÉPCSÖHÁZ" PrintArray(5, 0) = "2e.sz - E LÉPCSÖHÁZ" PrintArray(6, 0) = "2f.sz - F LÉPCSÖHÁZ" PrintArray(7, 0) = "2g.sz - G LÉPCSÖHÁZ" PrintArray(8, 0) = "2h.sz - IRODA_FITT_UZLET" PrintArray(9, 0) = "!2i.sz - PARKOLÓK-PINCE-egysz" PrintArray(10, 0) = "2j.sz - PARKOLÓK-FSZ" PrintArray(11, 0) = "2k.sz - TÁROLÓK" PrintArray(12, 0) = "3.sz - KIZÁRÓLAGOS" PrintArray(13, 0) = "4.KÜLÖN TULAJDON-ÖSSZESÍT!" PrintArray(14, 0) = "5.sz ÖnállóDöntTer" For i = 0 To UBound(PrintArray) - 1 Sheets(PrintArray(i, 0)).Activate msgString = "Nyomtatja " + Str(i + 1) + "__" + Application.ActiveSheet.name ask = MsgBox(msgString, vbYesNoCancel, "Nyomtatás", 0, 0) If ask = vbCancel Then End If ask = vbYes Then Application.ActivePrinter = "Adobe PDF a(z) Ne04: kimeneten" ActiveWindow.ActiveSheet.PrintOut Copies:=1, Collate:=True End If Next i

    a probléma, hogy a PriontOut metódus a fájlba mentés nevét kérdezi és nem a nyomtatási sorba küldött nevet (legalább is úgy tünik)
    pl. nagytudású ArchiCad szoftverünk (ha hallótál róla)a különbözö szintek nyomtatási neveit az épület szintnevekkel helyettesíti, igy mindig tudom mely szintet nyomja ki (de persze nemetschekkel dolgozom). attól félek ez a probléma a program forráskód szintjén "javítható" ki, illetve nagyon agy tudású mikroszoft nem gondolt ilyen mélységekbe...
    köszönöm
    fuxi
    Mutasd a teljes hozzászólást!
  • Valahogy így képzelem a megoldást (biztos van jobb):
    1. A nyomtatót "kézből" Suspendelném.
    2. A makróba beirnám a ciklus végére hogy az aktuális dokumentumot nevezze át a SetJob() segítségével.
    3. A nyomtató visszaállítása.


    Windows GDI

    SetJob
    The SetJob function pauses, resumes, cancels, or restarts a print job on a specified printer. You can also use the SetJob function to set print job parameters, such as the print job priority and the document name.

    Windows 95/98/Me: You can use the SetJob function to give a command to a print job, or to set print job parameters, but you cannot do both in the same call. Thus, when the Command parameter is nonzero, the function ignores the Level and pJob parameters. To set print job parameters, you must set Command to 0.

    Windows NT/2000/XP: You can use the SetJob function to give a command to a print job, or to set print job parameters, or to do both in the same call. The value of the Command parameter does not affect how the function uses the Level and pJob parameters. Also, you can use SetJob with JOB_INFO_3 to link together a set of print jobs. See Remarks for more information.
    Mutasd a teljes hozzászólást!
  • Üdv tibuD,
    ha esetleg nem lenne a kérésem túl pofátlan, le tudnád irni bővebben, hogyan delarálhatom és használhatom a SetJob-ot a GDI-ből (a pointer tipust nem találtam a vb-ben), valamint a printer leirója hogyan érhető el?
    kb eddig jutottam (ez persze nem sok, de még mindig építész vagyok ):

    Private Declare Sub SetJob Lib "GDI" ( hPrinter As HANDLE, JobId As Double, Level As Double, pJob As ??? [LPBYTE], Command Double)

    kösz
    fuxi
    Mutasd a teljes hozzászólást!
  • Nos, eddig jutottam:

    Option Explicit Private Const STANDARD_RIGHTS_REQUIRED = &HF0000 Private Const PRINTER_ACCESS_ADMINISTER = &H4 Private Const PRINTER_ACCESS_USE = &H8 Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE) Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrn As Long, pDefault As Any) As Long Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrn As Long) As Long Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Any, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long Private Declare Function SetJob Lib "winspool.drv" Alias "SetJobA" (ByVal hPrinter As Long, ByVal JobId As Long, ByVal Level As Long, pJob As Any, ByVal Command As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long Private Type PRINTER_DEFAULTS pDatatype As String pDevMode As Long pDesiredAccess As Long End Type Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Private Type JOB_INFO_1_NORMAL JobId As Long pPrinterName As String pMachineName As String pUserName As String pDocument As String pDatatype As String pStatus As String Status As Long Priority As Long Position As Long TotalPages As Long PagesPrinted As Long Submitted As SYSTEMTIME End Type Private Type JOB_INFO_1_BIN JobId As Long lpPrinterName As Long lpMachineName As Long lpUserName As Long lpDocument As Long lpDatatype As Long lpStatus As Long Status As Long Priority As Long Position As Long TotalPages As Long PagesPrinted As Long Submitted As SYSTEMTIME Dummy(0 To 1000) As Byte End Type Private Type JOB_INFO_1_MIX Bin As JOB_INFO_1_BIN Normal As JOB_INFO_1_NORMAL End Type Sub RenamePrinterDoc(PrinterName As String, DocumentName As String, NewName As String) Dim Result As Long Dim pd As PRINTER_DEFAULTS Dim hPrinter As Long Dim ji1 As JOB_INFO_1_MIX Dim BytesNeeded As Long Dim BytesNeeded2 As Long Dim nReturned As Long Dim i As Long pd.pDesiredAccess = PRINTER_ACCESS_ADMINISTER Call OpenPrinter(PrinterName, hPrinter, pd) If hPrinter = 0 Then MsgBox ("Nincs ilyen printer!") Exit Sub End If i = 0 Do Call EnumJobs(hPrinter, i, 1, 1, ByVal 0&, 0, BytesNeeded, nReturned) Call EnumJobs(hPrinter, i, 1, 1, ji1.Bin, BytesNeeded, BytesNeeded, nReturned) If nReturned = 0 Then MsgBox ("Nincs ilyen dokumentum!") ClosePrinter (hPrinter) Exit Sub End If BinToNormal ji1 If ji1.Normal.pDocument = DocumentName Then Exit Do i = i + 1 Loop ji1.Normal.pDocument = NewName NormalToBin ji1 SetJob hPrinter, ji1.Bin.JobId, 1, ji1.Bin, vbNull ClosePrinter (hPrinter) End Sub Private Sub BinToNormal(ji1 As JOB_INFO_1_MIX) With ji1 .Normal.JobId = .Bin.JobId .Normal.PagesPrinted = .Bin.PagesPrinted .Normal.Position = .Bin.Position .Normal.Priority = .Bin.Priority .Normal.Status = .Bin.Status .Normal.Submitted = .Bin.Submitted .Normal.TotalPages = .Bin.TotalPages .Normal.pDatatype = PointerToStringA(.Bin.lpDatatype) .Normal.pDocument = PointerToStringA(.Bin.lpDocument) .Normal.pMachineName = PointerToStringA(.Bin.lpMachineName) .Normal.pPrinterName = PointerToStringA(.Bin.lpPrinterName) .Normal.pStatus = PointerToStringA(.Bin.lpStatus) .Normal.pUserName = PointerToStringA(.Bin.lpUserName) End With End Sub Private Sub NormalToBin(ji1 As JOB_INFO_1_MIX) Dim i As Long Dim j As Long With ji1 .Bin.JobId = .Normal.JobId .Bin.PagesPrinted = .Normal.PagesPrinted .Bin.Position = .Normal.Position .Bin.Priority = .Normal.Priority .Bin.Status = .Normal.Status .Bin.Submitted = .Normal.Submitted .Bin.TotalPages = .Normal.TotalPages .Bin.Dummy(0) = 0 i = 1 If .Normal.pDatatype = "" Then .Bin.lpDatatype = 0 Else .Bin.lpDatatype = VarPtr(.Bin.Dummy(i)) For j = 1 To Len(.Normal.pDatatype) .Bin.Dummy(i) = Asc(Mid(.Normal.pDatatype, j, 1)) i = i + 1 Next j .Bin.Dummy(i) = 0 i = i + 1 End If If .Normal.pDocument = "" Then .Bin.lpDocument = 0 Else .Bin.lpDocument = VarPtr(.Bin.Dummy(i)) For j = 1 To Len(.Normal.pDocument) .Bin.Dummy(i) = Asc(Mid(.Normal.pDocument, j, 1)) i = i + 1 Next j .Bin.Dummy(i) = 0 i = i + 1 End If If .Normal.pUserName = "" Then .Bin.lpUserName = 0 Else .Bin.lpUserName = VarPtr(.Bin.Dummy(i)) For j = 1 To Len(.Normal.pUserName) .Bin.Dummy(i) = Asc(Mid(.Normal.pUserName, j, 1)) i = i + 1 Next j .Bin.Dummy(i) = 0 i = i + 1 End If If .Normal.pMachineName = "" Then .Bin.lpMachineName = 0 Else .Bin.lpMachineName = VarPtr(.Bin.Dummy(i)) For j = 1 To Len(.Normal.pMachineName) .Bin.Dummy(i) = Asc(Mid(.Normal.pMachineName, j, 1)) i = i + 1 Next j .Bin.Dummy(i) = 0 i = i + 1 End If If .Normal.pPrinterName = "" Then .Bin.lpPrinterName = 0 Else .Bin.lpPrinterName = VarPtr(.Bin.Dummy(i)) For j = 1 To Len(.Normal.pPrinterName) .Bin.Dummy(i) = Asc(Mid(.Normal.pPrinterName, j, 1)) i = i + 1 Next j .Bin.Dummy(i) = 0 i = i + 1 End If If .Normal.pStatus = "" Then .Bin.lpStatus = 0 Else .Bin.lpStatus = VarPtr(.Bin.Dummy(i)) For j = 1 To Len(.Normal.pStatus) .Bin.Dummy(i) = Asc(Mid(.Normal.pStatus, j, 1)) i = i + 1 Next j .Bin.Dummy(i) = 0 i = i + 1 End If End With End Sub Private Function PointerToStringA(ByVal lpStringA As Long) As String Dim Buffer() As Byte Dim nLen As Long If lpStringA Then nLen = lstrlenA(ByVal lpStringA) If nLen Then ReDim Buffer(0 To (nLen - 1)) As Byte CopyMemory Buffer(0), ByVal lpStringA, nLen PointerToStringA = StrConv(Buffer, vbUnicode) End If End If End Function Sub ZZ() RenamePrinterDoc "hp deskjet 5600 series", "Lister - test.vbp", "kutya" End Sub

    A "Sub ZZ()" Csak tesztcélokat szolgál, a munkét a RenamePrinterDoc() végezné.

    Ami a jó: hiba nélkül lefut.
    Ami rossz: nem csinál semmit :(
    Majd holnap tovább próbálom.

    Én se vagyok programozó, hanem csak CAD-CAM-os.

    Mutasd a teljes hozzászólást!
  • A
    SetJob hPrinter, ji1.Bin.JobId, 1, ji1.Bin, vbNull
    sor helyesen:
    SetJob hPrinter, ji1.Bin.JobId, 1, ji1.Bin,0

    De ez bnem változtat semmin...
    Mutasd a teljes hozzászólást!
  • Én se vagyok programozó, hanem csak CAD-CAM-os.


    azannyát, ahhoz képest jól nyomod...
    köszönöm bekopiztam, működik..illetve elméletileg. Ugyanis:
    Adobe PDF nyomtató pause-olva, de hiába, a fájl nevét azonnal kéri. Mielőtt az áltatad adott kód lefut [azonnal a printOut után raktam].
    Igy az átnevezés a nyomtatási sorban megtörténik[profi!!!], mégis a mentési dialóg ablakban a dokumentum neve kerül fájlnévként megjelölésre. Sajnos a probléma túlnőtte magát,illetve lehet, hogy nem itt kellene keresni a megoldást, hanem a distiller-nél, mivel az csinálja a pdf-et.
    Úgy gondolom, oldja meg az excel ill. adobe egymás között. úgysem fogja.
    köszönöm a fáradoásodat
    üdv.
    fuxi
    Mutasd a teljes hozzászólást!
  • A csúnya, de talán működö megoldás: a cikluson belül használj SaveAS-t a PrintOut elött....
    Mutasd a teljes hozzászólást!
  • Üdv tibuD, a dolog müködne, ha az excel fájl nem 5Mb-os volna (adatbátis-kezelőben kellett volna megoldanom, de nem volt rá elég idő)és egy-egy mentés igy kb 10 mp. Legelőszőr nekem is ez jutott eszembe de elvetettem.
    Azért kösz.
    üdv.
    fuxi

    ui: hol tanultad ilyen mélységben aprogramozást? a CAD-CAM "asztal" mellet biztonsan nem.
    Mutasd a teljes hozzászólást!
  • Pedig pont a "CAD-CAM" asztal mellett. De igazából nem nagyon értek hozzá, a Google sokat segít. (Ennek a proginak is jóval több mint a fele a netről származik).
    Mutasd a teljes hozzászólást!
  • Hát akkor megpróbálok felzárkózni...kösz.
    üdv.
    fuxi
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd