VBA发票开发:未选择Term时如何让Due Date保持空白?
解决方案
问题根源
- 变量类型不匹配:
term定义为Byte,未选择下拉列表时单元格为空,VBA会自动转为数值0,但你用字符串"0"做判断,导致逻辑失效; - Date类型无法存空值:
duedate是Date类型,默认会被初始化为1899-12-30(显示为12:00:00AM),没法通过赋值空字符串实现单元格空白; - 变量名拼写错误:代码里的
dt_issue是笔误,应该是issdate。
修改后的完整代码
Sub RecordOfInvoice() Dim invno As Long Dim compname As String Dim contname As String Dim po As String Dim amt As Currency Dim issdate As Date Dim term As Variant ' 改成Variant,兼容空单元格 Dim nextrec As Range invno = Range("G11") compname = Range("A10") contname = Range("A11") po = Range("G15") amt = Range("G43") issdate = Range("G13") term = Range("G17") ' 空单元格会被赋值为Empty Set nextrec = Sheet5.Range("A1048576").End(xlUp).Offset(1, 0) ' 写入基础发票数据 nextrec = invno nextrec.Offset(0, 1) = compname nextrec.Offset(0, 2) = contname nextrec.Offset(0, 3) = po nextrec.Offset(0, 4) = amt nextrec.Offset(0, 5) = issdate ' 单独处理到期日(Due Date) If IsEmpty(term) Or term = 0 Then nextrec.Offset(0, 6).ClearContents ' 直接清空单元格,实现空白效果 Else nextrec.Offset(0, 6) = issdate + term ' 计算并写入到期日 End If End Sub
关键修改说明
- 把
term的类型改为Variant,这样能正确接收单元格的空值(Empty); - 放弃用
duedate变量存空值的思路,直接操作目标单元格:当term为空或0时,调用ClearContents清空单元格; - 修正了
dt_issue的拼写错误,替换为正确的issdate; - 拆分到期日的写入逻辑,单独判断处理,逻辑更清晰。
额外优化建议
可以给Issue Date的读取增加判断,避免单元格为空时触发错误:
If IsDate(Range("G13")) Then issdate = Range("G13") Else MsgBox "请填写发票开具日期!" Exit Sub End If
内容的提问来源于stack exchange,提问作者Professional Newbie
相关产品推荐
相关产品推荐

