Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
Nincs ezzel semmi baj, csak előtte a másolandó területet ki kell jelölni, és másolni, majd az új helyre állva kell indítani a makrót – akár bill. kombinációval. Én is sűrűn alkalmazom, de a végére még betettem a kijelölés megszüntetését.
Szeretnék egy érték beillesztés makrót, hogy majd a hozzárendelt billentyűkombinációval működjön az érték beillesztés, de hibaüzenetet kapok a futtatáskor. Mi a baj ezzel a makróval?
Sub PasteValue() ' ' PasteValue Makró ' Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ActiveSheet.Protect UserInterfaceOnly:=True
If Target.Column = 1 Then ActiveCell = "ü" With Selection.Font .Name = "Wingdings" .Bold = True .ColorIndex = 3 End With Range("A" & Target.Row & ":U" & Target.Row).Select With Selection .Font.ColorIndex = 3 .Locked = True End With End If
If Target.Column = 3 Then Range(Target.Address) = Date End Sub
Ha az A oszlopban (If Target.Column = 1) klikkelsz duplán, akkor beírja a pipát, és zárolja a sor celláit az A:U oszlopokban.
Ha viszont a C oszlopban kattintasz duplán, akkor a klikkelés helyére beírja a mai dátumot.
Talán egyszerűbb lenne letölteni egy ingyenes pdf nyomtató drivert, ettől kezdve a pdf nyomtatás külön nyomtatóként kiválasztható. Én ezt használom, ha máshova kell átvinni fájlokat, nem kell beállítani nyomtatási képet az aktuális nyomtatóhoz.
Mit szólsz ehhez a megoldáshoz? Megszünteted a jelölőnégyzeteket. Egy-egy cellán duplaklikkre piros pipa jel jelenik meg, az aktuális sor A:U tartománya zárolt lesz, a karakterek szintén piros színben pompáznak?
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ActiveSheet.Protect UserInterfaceOnly:=True ActiveCell = "ü" With Selection.Font .Name = "Wingdings" .Bold = True .ColorIndex = 3 End With Range("A" & Target.Row & ":U" & Target.Row).Select Selection.Font.ColorIndex = 3 Selection.Locked = True End Sub
Egy csoporton belül a szerveren elhelyezett táblázatot (egyfajta iktatót) soronként töltünk ki.
Amikor a tényleges iktatás megtörténik, és minden rendben van a beírt adatokkal, akkor a csoportvezető pipálná, hogy rendben (ez egyben át is szinezné az adott sort, hogy feltűnőbb legyen), és onnan kezdve nem lehetne módosítani az adott sort. Tehát a pipálásnak kell az utolsónak lenni.
Próbáld meg úgy átrendezni az oszlopaidat, hogy először kelljen a négyzetet jelölni, és utoljára adatot bevinni a billentyűzetről. Ehhez az utolsó oszlophoz igazítsd a makrót.
Van egy kódsor, amelyet neten találtam, és amely arra szolgál, hogy EXCEL makró által egy excel munkalapot ki tudjak nyomtatni PDF formátumu fájlba mindenféle megadott paraméter szerint. A kód azonban leáll már rögtön a piros sornál. A PDFCreator fel van telepítve.
Hibaüzenet: User-defined type not defined
Mi lehet a hiba???
Sub PrintToPDF_Early() Dim pdfjob As PDFCreator.clsPDFCreator Dim sPDFName As String Dim sPDFPath As String Dim bRestart As Boolean
'/// Change the output file name here! /// sPDFName = "testPDF.pdf" sPDFPath = ActiveWorkbook.Path & Application.PathSeparator
'Check if worksheet is empty and exit if so If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub
'Activate error handling and turn off screen updates On Error GoTo EarlyExit Application.ScreenUpdating = False Set pdfjob = New PDFCreator.clsPDFCreator
'Check if PDFCreator is already running and attempt to kill the process if so Do bRestart = False Set pdfjob = New PDFCreator.clsPDFCreator If pdfjob.cStart("/NoProcessingAtStartup") = False Then 'PDF Creator is already running. Kill the existing process Shell "taskkill /f /im PDFCreator.exe", vbHide DoEvents Set pdfjob = Nothing bRestart = True End If Loop Until bRestart = False
'Assign settings for PDF job With pdfjob .cOption("UseAutosave") = 1 .cOption("UseAutosaveDirectory") = 1 .cOption("AutosaveDirectory") = sPDFPath .cOption("AutosaveFilename") = sPDFName .cOption("AutosaveFormat") = 0 ' 0 = PDF .cClearCache End With
'Delete the PDF if it already exists If Dir(sPDFPath & sPDFName) = sPDFName Then Kill (sPDFPath & sPDFName)
'Print the document to PDF ActiveSheet.PrintOut copies:=1, ActivePrinter:="PDFCreator"
'Wait until the print job has entered the print queue Do Until pdfjob.cCountOfPrintjobs = 1 DoEvents Loop pdfjob.cPrinterStop = False
'Wait until the file shows up before closing PDF Creator Do DoEvents Loop Until Dir(sPDFPath & sPDFName) = sPDFName
Cleanup: 'Release objects and terminate PDFCreator Set pdfjob = Nothing Shell "taskkill /f /im PDFCreator.exe", vbHide On Error GoTo 0 Application.ScreenUpdating = True Exit Sub
EarlyExit: 'Inform user of error, and go to cleanup section MsgBox "There was an error encountered. PDFCreator has" & vbCrLf & _ "has been terminated. Please try again.", _ vbCritical + vbOKOnly, "Error" Resume Cleanup
Itt egy fapados. Kell neki bemenő adatként, hogy mekkora cellatartományon belül kell invertálni a kijelölt cellákat.
Minél nagyobb ez a tartomány, annál tovább tart a futás. Egy teljes oszlopra kb. 2-3 másodperc.
Ha a feladat olyan, lehet neki ActiveSheet.UsedRange -et beadni.
Sub Inverz_Select(Src As Range) Dim Unio As Range, c As Range
For Each c In Src.Cells If Intersect(c, Selection) Is Nothing Then If Unio Is Nothing Then Set Unio = c Else Set Unio = Union(Unio, c) End If End If Next Unio.Select End Sub
Ez a jelölőnégyzetes makró valami fantasztikus. Most játszom vele, hogy a megfelelő helyre kerüljenek, de olyan valamit készítettél, amit már nagyon sokszor használtam volna, csak az a fránya élőmunka elriasztott.