請教各位高手, 想在EXCEL每次列印時, 固定欄位產生流水號

我想請問, 只有一張工作表, 想在欄位F4做流水編號, 編號: ECSDRD060XXX, XXX為流水號,

在印多份時會自動跳號, 例如三十張就到ECSDRD060030,下次例印會記住上次的編號到幾號,

這樣需求, 是要寫巨集或VBA ? 程式該如何撰寫? (EXCEL版本2010) 再麻煩各位高手協助解惑!!萬分感謝
2020-09-28 14:19 發佈
sunnyboy308大大

網路上查到的程式
https://www.extendoffice.com/documents/excel/3606-excel-auto-increment-number-when-printing.html

不過上面程式是針對列印一次增加流水號,不是針對列印份數增加流水號,所以列印10份就要呼叫印表機10次!(沒印表機所以無法實測,您可以自己先試試看)
所以我換個做法,列印10份程式會產生1~10.jpg檔案,每個圖片的F4都是累加的流水號。
之後只要同時選擇這10個jpg檔,按右鍵選擇列印,應該就可以一次列印所有份數了。
ps.對vba完全不熟,應該有更好的方法,就等其他大大提供了

以下程式只需要修改:
(1)第8行想要列印的範圍 =>A1:F10
 Set rgExp = Range("A1", "F10")
(2)第10行jpg要存的目錄在哪? =>d:\test\
 folder = "d:\test\"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

Sub testPrint()

Dim xCount As Variant
Dim xScreen As Boolean
Dim I As Long
On Error Resume Next
Dim rgExp As Range
Set rgExp = Range("A1", "F10")
Dim folder As String
folder = "d:\test\"



LInput:
xCount = Application.InputBox("Please enter the number of copies you want to print:", "Kutools for Excel")
If TypeName(xCount) = "Boolean" Then Exit Sub
If (xCount = "") Or (Not IsNumeric(xCount)) Or (xCount < 1) Then
MsgBox "error entered, please enter again", vbInformation, "Kutools for Excel"
GoTo LInput
Else
xScreen = Application.ScreenUpdating
Application.ScreenUpdating = False
For num = 1 To xCount
Application.ScreenUpdating = xScreen
new_serial = Replace(ActiveSheet.Range("F4").Value, "ECSDRD060", "") + 1
ActiveSheet.Range("F4").Value = " ECSDRD060" & new_serial
rgExp.CopyPicture Appearance:=xlScreen, Format:=xlPrinter
With ActiveSheet.ChartObjects.Add(Left:=rgExp.Left, Top:=rgExp.Top, _
Width:=rgExp.Width, Height:=rgExp.Height)
.Name = "myChart"
.Activate
End With
ActiveChart.Paste
ActiveSheet.ChartObjects("myChart").Chart.Export folder & num & ".jpg"
ActiveSheet.ChartObjects("myChart").Delete

Next

Call Shell("explorer.exe" & " " & folder, vbNormalFocus)
End If

End Sub
shibuy wrote:
每個圖片的F4都是累加的流水號


有點好奇,當填入份數(10份),按下按鈕後,每份內容不是計數+1後直接送到印表機即可?還是再另存jpg?....然後再去找到jpg(檔案總管會開啟),全選列印?這樣不是多繞了一圈?呵。

shibuy wrote:
new_serial = Replace(ActiveSheet.Range("F4").Value, "ECSDRD060", "") + 1


剛開始執行的時候,這句如果會有問題(+1的效果無效),或許可以修改成:
new_serial = Val(Replace(ActiveSheet.Range("F4").Value, "ECSDRD060", "")) + 1
試試。
Der,misser1
在巨集 thisworkbook 中加入

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Range("A1") = Range("A1") + 1
Range("A2") = "ECSDRD060" & Range("A1").Text
End Sub
Eigen wrote:
在巨集 thisworkbook...(恕刪)


這個「小問題」是,如果使用者在列印對話框選擇印10份:
1.這10份流水號會都相同。
2.印完後流水號和列印前差1(而不是10)。

似乎和樓主所述不一樣喔??
Der,misser1
misser wrote:
1.這10份流水號會都相同。


自己再錄製個巨集

改成
Sub Macro1()

For i = 1 To Range("A3")
ActiveSheet.PrintOut
Next i

End Sub

執行這個巨集就能決定你要印幾份
misser wrote:
有點好奇,當填入份數(恕刪)


misser 大大

因為沒有印表機所以我測試ActiveSheet.PrintOut的時候都會彈出印表機視窗,因此我認為應該是"每次"列印都會出現 所以才請樓主自行測試連結上面的程式。
我自己加上去的程式是每個流水號都生成圖檔,然後自動開啟目錄後再全選圖片列印即可。
但是實際上是不是也要跑10次印表機選項還是只有一次我也是不曉得,這都要請樓主自行測試了

另外您提到下面程式在我的excel不加val()一樣可以+1是正常的,可能是我們的版本不同
我以為要用Cint()原來還有Val()可以用,謝謝提供資訊

new_serial = Val(Replace(ActiveSheet.Range("F4").Value, "ECSDRD060", "")) + 1
shibuy wrote:
所以我測試ActiveSheet.PrintOut的時候都會彈出印表機視窗


彈出視窗?不是直接送到印表機?(那個送印視窗應該會「立即關閉」,就跟你把圖檔直接存檔概念差不多)

我個人做過的直接列印,也是直接送印:
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

這樣就送印完成。(不會打開平時的列印預覽視窗,而是直接送印,有個很短暫的送印訊息,會自動關閉)

所以我才覺得,您調整流水號,再存jpg...循環的動作,可以直接改成:調整流水號,再直接送印(1份)....循環完成,送印表機列印也完成了(不用再開jpg,送印)

shibuy wrote:
另外您提到下面程式在我的excel不加val()一樣可以+1是正常的,可能是我們的版本不同

不好意思啦,因為我的環境執行時,確實是無作用(流水號不會增加),所以我才想說提醒一下,如果剛好樓主也遇到這情形,可以立刻調整解決。(我也是猜測您本身執行應該是沒遇到這問題)

我的版本是2010。
Der,misser1
misser wrote:
彈出視窗?不是直接送(恕刪)

misser大大
一切都是因為沒有印表機沒辦法測試,我才會認為印10份會出現10次列印訊息
所以才會搞出匯出圖檔後再全選列印

不用不好意思啦
misser wrote:
不好意思啦,因為我的環境執行時
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?