16. august 2007 - 15:48Der er
35 kommentarer og 1 løsning
Udskriftsmakro med menu
Hej
Jeg har et spørgsmål som jeg har grublet over om mon kan lade sig gøre med noget vba.
Jeg har en projektmappe med ca. 20 ark som skal udskrives. Dog er det ikke altid at alle ark skal udskrives. Problemet er ofte at man får markeret alle de ark man vil udskrive og glemmer at ophæve denne markering igen.
Kan man lave en knap/funktion via vba som kalder en slags boks/menu som nedenstående:
Afkryds Arknavn Antal sider
|x| Ark 1 2 | | Ark 2 6 |x| Ark 3 1
UDSKRIV LUK BOKS
Arknavn skal vba selv hente fra alle arkene i projektmappen og liste dem dernedaf. Antal sider står i celle A1 på alle ark
Man skal så kunne afkrydse til venstre hvilke ark man vil have skrevet ud.
Ja. Lav en form med en listbox med multiple selection og liststyle sat til fmStyleListOption (det giver afkrydsningsfelt). Heri kan du så indlæse alle ark. Lav en OK-knap, som derefter udskriver de ark, som er krydset af i din listbox.
Private Sub CommandButton1_Click() Dim D As Long, W, Antal 'W = 0 GlArk = ActiveSheet.Name ReDim Arkene(0) For D = 1 To I If Me.Controls("CheckBox" & D).Value = True Then ReDim Preserve Arkene(W) Arkene(W) = Me.Controls("CheckBox" & D).Caption W = W + 1
End If Next If W = "" Then MsgBox "Ingen ark valgt!" Exit Sub End If Antal = Me.TextBox1.Value If Not IsNumeric(Antal) And Antal > 0 Then MsgBox "Forkert antal" Exit Sub End If
Sheets(Arkene).Select ActiveWindow.SelectedSheets.PrintOut Copies:=Antal, Collate:=True Sheets(GlArk).Select Me.Hide End Sub
Private Sub CommandButton2_Click() UserForm1.Hide End Sub
Private Sub UserForm_activate() Dim Y I = 0 For Each Y In ThisWorkbook.Sheets I = I + 1 Set lb = UserForm1.Controls.Add("Forms.CheckBox.1", "CheckBox" & I, True) With lb .Top = 50 + 18 * I .Left = 50 .Caption = Y.Name End With Next End Sub
Jeg er desværre nok nødt til at bede om lidt mere hjælp om hvordan jeg skal placere kode (akyhne). Antal sider funktionen med ?
Jeg har selv fundet den her (og den virker:
Er den bedre eller dårligere at bruge end jeres forslag. Der mangler dog også antal sider funktionen.
Option Explicit Sub SelectSheets() Dim I As Integer Dim TopPos As Integer Dim SheetCount As Integer Dim PrintDlg As DialogSheet Dim CurrentSheet As Worksheet Dim cb As CheckBox
' Check for protected workbook If ActiveWorkbook.ProtectStructure Then MsgBox "Filen er skrivebeskyttet", vbCritical Exit Sub End If
' Add a temporary dialog sheet Set CurrentSheet = ActiveSheet Set PrintDlg = ActiveWorkbook.DialogSheets.Add
SheetCount = 0
' Add the checkboxes TopPos = 40 For I = 1 To ActiveWorkbook.Worksheets.Count Set CurrentSheet = ActiveWorkbook.Worksheets(I) ' Skip empty sheets and hidden sheets If Application.CountA(CurrentSheet.Cells) <> 0 And _ CurrentSheet.Visible Then SheetCount = SheetCount + 1 PrintDlg.CheckBoxes.Add 78, TopPos, 150, 16.5 PrintDlg.CheckBoxes(SheetCount).Text = _ CurrentSheet.Name TopPos = TopPos + 13 End If Next I
' Move the OK and Cancel buttons PrintDlg.Buttons.Left = 240
' Set dialog height, width, and caption With PrintDlg.DialogFrame .Height = Application.Max _ (68, PrintDlg.DialogFrame.Top + TopPos - 34) .Width = 230 .Caption = "Vælg hvilke ark som skal udskrives" End With
' Change tab order of OK and Cancel buttons ' so the 1st option button will have the focus PrintDlg.Buttons("Button 2").BringToFront PrintDlg.Buttons("Button 3").BringToFront
' Display the dialog box CurrentSheet.Activate
If SheetCount <> 0 Then If PrintDlg.Show Then For Each cb In PrintDlg.CheckBoxes If cb.Value = xlOn Then Worksheets(cb.Caption).Select Replace:=False End If Next cb ActiveWindow.SelectedSheets.PrintOut Copies:=1 ActiveSheet.Select End If Else MsgBox "Alle ark er tomme" End If
Havde ikke lige fået fat i at du skulle kunne vælge sideantal for hvert ark, Det kan du nu:
Public I As Long
Private Sub CommandButton1_Click() Dim D As Long, W, Antal W = 0 GlArk = ActiveSheet.Name ReDim Arkene(0) ReDim Antal(0) For D = 1 To I If Me.Controls("CheckBox" & D).Value = True Then If Not IsNumeric(Me.Controls("TextBoxAntal" & D).Value) And Me.Controls("TextBoxAntal" & D).Value > 0 Then MsgBox "Forkert antal ved arket" Exit Sub End If ReDim Preserve Arkene(W) Arkene(W) = Me.Controls("CheckBox" & D).Caption ReDim Preserve Antal(W) Antal(W) = Me.Controls("TextBoxAntal" & D).Value W = W + 1 End If Next
If W = "" Then MsgBox "Ingen ark valgt!" Exit Sub End If
For D = 0 To UBound(Arkene) Sheets(Arkene(D)).Select ActiveWindow.SelectedSheets.PrintOut Copies:=Antal(D), Collate:=True Next Sheets(GlArk).Select Me.Hide End Sub
Private Sub CommandButton2_Click() UserForm1.Hide End Sub
Private Sub UserForm_activate() Dim Y I = 0 For Each Y In ThisWorkbook.Sheets I = I + 1 Set lb = UserForm1.Controls.Add("Forms.CheckBox.1", "CheckBox" & I, True) With lb .Top = 50 + 18 * I .Left = 50 .Caption = Y.Name End With Set lb = UserForm1.Controls.Add("Forms.TextBox.1", "TextBoxAntal" & I, True) With lb .Top = 50 + 18 * I .Left = 100 .Value = "" .Width = 30 End With Set lb = UserForm1.Controls.Add("Forms.Label.1", "LabelAntal" & I, True) With lb .Top = 56 + 18 * I .Left = 135 .Caption = "Antal sider" End With Next End Sub
Jeg mangler stadig lidt hjælp med hvor og hvordan jeg implementerer din kode.
Og med hensyn til sidetal (jeg kan ikke lige gennemskue din kode) skal jeg ikke kunne vælge sidetal men kun have det som en oplysning ud for hvert ark hvor mange sider det enkelte ark fylder. Denne oplysning har jeg som før skrevet allerede i celle A1 i hvert ark, så der kan den vel hente oplysningen fra ?
Excel -> Tryk Alt+F11 for at komme ind i VBA editoren.
* Højreklik i vinduet "Projekt - VBAprojekt. * Indsæt en userform: Insert -> Userform. * Dobbeltklik på Forms -> Userform1. *Indsæt 2 knapper (Commandbutton). * Dobbeltklik et tomt sted på din userform - et kodevindue åbnes i højre side. * kopier koden fra 16/08-2007 19:40:07 * klik i kodevinduet * Tryk Ctrl+A * tryk Ctrl+V
Nej, du skal indsætte en knap i dit ark, for at kalde koden. Makroer kan kun ses fra Funktioner - Makro - Makroer , såfremt de ligger i et modul. Ligger de i stedet i et arkmodul eller i en form, kan de ikke ses den vej.
I Excel:
* Åbn værktøjslinien "Kontrolelementer". * Marker en kommandoknap og sæt den i arket * Dobbeltklik på knappen, og indsæt userform1.show
Private Sub CommandButton1_Click() UserForm1.Show End Sub
Private Sub UserForm_activate() Dim Y I = 0 For Each Y In ThisWorkbook.Sheets I = I + 1 Set lb = UserForm1.Controls.Add("Forms.CheckBox.1", "CheckBox" & I, True) With lb .Top = 18 * I .Left = 20 .Caption = Y.Name End With Set lb = UserForm1.Controls.Add("Forms.TextBox.1", "TextBoxAntal" & I, True) With lb .Top = 18 * I .Left = 70 .Value = "" .Width = 30 End With Set lb = UserForm1.Controls.Add("Forms.Label.1", "LabelAntal" & I, True) With lb .Top = 18 * I .Left = 105 .Caption = "Antal sider" End With Next Me.CommandButton1.Top = 18 * I + 25 Me.CommandButton1.Left = 10 Me.CommandButton2.Top = 18 * I + 25 Me.CommandButton2.Left = 90 Me.Height = 18 * I + 80 Me.Width = 180 End Sub
Så lige din kommentar om oplysninger af sideantal fra celle A1:
Private Sub UserForm_activate() Dim Y I = 0 For Each Y In ThisWorkbook.Sheets I = I + 1 Set lb = UserForm1.Controls.Add("Forms.CheckBox.1", "CheckBox" & I, True) With lb .Top = 18 * I .Left = 20 .Caption = Y.Name End With Set lb = UserForm1.Controls.Add("Forms.TextBox.1", "TextBoxAntal" & I, True) With lb .Top = 18 * I .Left = 70 .Value = "" .Width = 30 .Enabled = False .ControlSource = Y.Name & "!A1" End With Set lb = UserForm1.Controls.Add("Forms.Label.1", "LabelAntal" & I, True) With lb .Top = 18 * I .Left = 105 .Caption = "Antal sider" End With Next Me.CommandButton1.Top = 18 * I + 25 Me.CommandButton1.Left = 10 Me.CommandButton2.Top = 18 * I + 25 Me.CommandButton2.Left = 90 Me.Height = 18 * I + 80 Me.Width = 180 End Sub
1. En ekstra knap = vis udskrift (printpreview) 2. Der vises antal sider (celle A1) på alle ark 3. Den udskriver altid sidste side i projektmappen ??? (det skal den ikke)
Du snakkede oprindeligt om at kunne ændre sideantallet via boksene på formen, men skippede det. Hvis du vil kunne ændre sidetallet for arkene på formen, og samtidig få sidetallet gemt i det respektive ark, skal du bruge .Controlsource - ellers .Value
1) Ja 2) Hvis man sætter hak i flere ark skal de starte fra side 1 og bare løbe derudaf. Ligesom hvis jeg manuelt markede fanebladene/arkene (selvfølgelig kan der være tastet at nogle ark skal starte med et specielt sidenummer). Giver det mening. 3)Dejligt
Grunden til det her er bare at folk glemmer at ophæve arkmarkering når de har udskrevet flere ark. Og så er det nemmere at overskue markeringen af ark til udskriv via userformen end ved at manuelt skulle markerede hver enkelt fane, da der er så mange at man skal scrolle for at finde dem.
Fors. + indh. skal ikke have sidenummer (det har de heller ikke) Sels.opl. har sidenummer 2 og resten har "Auto" i sidetal
Så hvis jeg markerer fra Fors. og fremefter udskrives de således:
Fors. = ingen sidetal Indh. = ingen sidetal Sels. opl. = side (2+hvor mange sider den fylder) Led.påt. = hvor sels.opl. slutter+hvor mange sider den fylder)
Osv.
Måske du kan bruge det som står i bunden på denne side (det var den anden løsning jeg legede med på et tidspunkt)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.