原本想用python或者QT写一个,刚想动手就发现读取excel的内容api就很麻烦了。该想法直接夭折了。只好祭出VBA。。。
而且excel对于打印票据这种东西,天生有优势。于是边百度边写了几百行代码,感谢microsoft的编辑器,调试很方便(比我用过的python编辑器还强大),再次膜拜微软一把。。
不足:对打开的表格要求很高(需要做格式判断),不够聪明
贴代码,vba的代码看的懂英文单词的基本都知道什么意思,把以下内容复制到宏代码中
下载: vba.txt
- Sub printSpecial()
- '
- ' 功能:打印选中用户工资单
- ' 宏由 xningcat 录制,时间: 2010-4-14
- '
- Dim wksh As Worksheet
- Set wksh = ActiveWorkbook.Worksheets(1)
- Dim name As String
- name = Selection.Value2
- name = trimName(name)
- Dim fRng As Range
- Set fRng = wksh.Next.UsedRange.Find(what:=name, lookat:=xlWhole)
- Dim cardNo As String
- If Not fRng Is Nothing Then
- cardNo = fRng.Offset(0, 1).Value
- '调整打印的格式
- Dim sh As Worksheet
- Set sh = wksh.Next.Next
- EditSheet3AndPrint(sh,name,cardNo)
- End If
- End Sub
- Sub PrintAll()
- '
- ' 功能:打印所有用户工资单
- ' 宏由 xningcat 录制,时间: 2010-4-14
- '
- Dim wksh As Worksheet
- Set wksh = ActiveWorkbook.Worksheets(1)
- lastOne = wksh.Range("A100").End(xlDown).Row
- If lastOne > 100 Then
- lastOne = 99
- End If
- Number = 1
- For i = 1 To lastOne Step 1
- Dim rng As Range
- Set rng = Cells(i, "A")
- If Not rng.Value2 <> Number Then
- '找到了相关数据
- Dim name As String
- name = Cells(i, "B").Value
- name = trimName(name)
- Dim fRng As Range
- Dim cardNo As String
- Set fRng = wksh.Next.UsedRange.Find(what:=name, lookat:=xlWhole)
- If Not fRng Is Nothing Then
- cardNo = fRng.Offset(0, 1).Value
- Number = Number + 1
- '调整打印的格式
- Dim sh As Worksheet
- Set sh = wksh.Next.Next
- EditSheet3AndPrint(sh,name,cardNo)
- End If
- End If
- Next
- End Sub
- Private Sub EditSheet3AndPrint(ByVal sh As Worksheet,ByVal name As String,ByVal cardNo As String)
- '
- ' 功能:生成票据格式并打印
- ' 宏由 xningcat 录制,时间: 2010-4-14
- '
- With sh
- .Rows.RowHeight = 14.25
- .Cells(5, "A").RowHeight = 21.75
- .Cells(6, "C").Value = name
- .Cells(6, "C").ColumnWidth = 8.38
- .Cells(6, "D").ColumnWidth = 32.52
- .Cells(6, "E").Value = "人民币"
- .Cells(8, "C").Value = cardNo
- End With
- '打印
- sh.PrintOut
- End Sub
- Private Function trimName(ByVal name As String)
- '
- ' 功能:去掉名字中的空格
- ' 宏由 xningcat 录制,时间: 2010-4-14
- '
- Dim retStr As String
- For i = 1 To Len(name) Step 1
- s = Mid(name, i, 1)
- If s <> " " Then
- retStr = retStr & s
- End If
- Next
- trimName = retStr
- End Function
No related posts.
评论
发表评论 反向链接