Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 自动编号重置_Vba_Excel - Fatal编程技术网

Vba 自动编号重置

Vba 自动编号重置,vba,excel,Vba,Excel,在Excel中,我试图根据当前年份和序列中的下一个数字创建一个自动编号单元格。示例表14/001中的第一行,下一行应该是14/002 我已经将我的工作表格式化为表格,我的公式是单元格A2中的=TEXT(TODAY(),“yy”)和“/”TEXT(行(A1),“000”) 当我在表中的行上单击tab键并到达行的最后一个单元格时,它默认为下一行,创建新行,向下复制公式,并按预期的方式递增一。那部分工作得很好 我不知道该怎么做的是,到2015年,我该如何重置/00?至/001因此,2015年1月1日的

在Excel中,我试图根据当前年份和序列中的下一个数字创建一个自动编号单元格。示例表
14/001
中的第一行,下一行应该是
14/002

我已经将我的工作表格式化为表格,我的公式是单元格
A2
中的
=TEXT(TODAY(),“yy”)和“/”TEXT(行(A1),“000”)

当我在表中的行上单击tab键并到达行的最后一个单元格时,它默认为下一行,创建新行,向下复制公式,并按预期的方式递增一。那部分工作得很好

我不知道该怎么做的是,到2015年,我该如何重置
/00
?至
/001
因此,2015年1月1日的下一行应为
15/001

=TEXT(TODAY(),"yy")& "/" & if(left(previous_cell,2)=TEXT(TODAY(),"yy"), TEXT(ROW(A1),"000"), "001") =文本(今天(),“yy”)和“/”& 如果(左(上一个单元格,2)=文本(今天(),“yy”), 正文(第(A1)行,“000”), "001")
由于您愿意接受VBA解决方案,因此假设自动编号将出现在列a中。手动将第一个值放入A1。然后在工作表代码区域中输入以下事件宏:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim A As Range, oldYr As String, yr As String, N As Long, oldN As Long
    Set A = Range("A2:A" & Rows.Count)
    If Intersect(Target, A) Is Nothing Then Exit Sub
    If Target.Value <> "" Or Target.Offset(-1, 0) = "" Then Exit Sub
    Cancel = True
    ary = Split(Target.Offset(-1, 0).Value, "/")
    oldYr = ary(0)
    oldN = CLng(ary(1))
    yr = Right(CStr(Year(Date)), 2)
    If yr = oldYr Then
        Target.Value = yr & "/" & Format(oldN + 1, "000")
    Else
        Target.Value = yr & "/" & Format(1, "000")
    End If
End Sub
Private子工作表\u双击之前(ByVal目标作为范围,Cancel作为布尔值)
变暗A为范围,老Y为字符串,老Y为字符串,N为长,老N为长
设置A=范围(“A2:A”和行数)
如果Intersect(Target,A)为空,则退出Sub
如果Target.Value“”或Target.Offset(-1,0)=“”,则退出Sub
取消=真
ary=拆分(目标偏移量(-1,0).Value,“/”)
oldYr=ary(0)
oldN=CLng(第(1)项)
年=右(CStr(年(日)),2)
如果yr=oldYr,则
Target.Value=yr&“/”格式(oldN+1,“000”)
其他的
Target.Value=yr&“/”格式(1,“000”)
如果结束
端接头
如果双击列A中的第一个空单元格,将在该单元格中输入下一个自动编号

由于它是工作表代码,因此安装和自动使用非常容易:

  • 在Excel窗口底部附近的选项卡名称上单击鼠标右键
  • 选择查看代码-这将打开一个VBE窗口
  • 粘贴内容并关闭VBE窗口
  • 如果您有任何顾虑,请先在试用工作表上试用

    如果保存工作簿,宏将与工作簿一起保存。 如果在2003年以后使用Excel版本,则必须保存 文件的格式为.xlsm而不是.xlsx

    要删除宏,请执行以下操作:

  • 如上所述打开VBE窗口
  • 清除代码
  • 关闭VBE窗口
  • 要了解有关宏的更多信息,请参阅:

    要了解有关事件宏(工作表代码)的详细信息,请参阅:


    必须启用宏才能工作

    我希望您能意识到,在2015年1月1日,您专栏中的所有单元格都将切换到15/XXX。我能想到的方法是,第一行是“种子”行-不带公式-允许后续行上的公式进行文本比较,以决定是否重置计数器并增加年份代码。不起作用-IF函数将始终返回true,即使没有返回true,您也只会在第一行上获得“001”,并更改年份。之后的行将恢复为仅显示当前行号,例如1月1日的15/001,然后1月2日的15/367。这不是要求的结果吗?个人认为要求是15/001,15/002等。无论如何,fmla中的If函数将始终返回真值,导致数字持续上升,且从未重置,因此该点没有意义。