Excel 粘贴多个单元格时类型不匹配
我正在尝试将一个工时数据库粘贴到excel文件中,该文件将自动计算每项工作所用的时间和总工时。每次复制/粘贴一个单元格时,一切正常。当我尝试复制2个或多个单元格时,在以下位置出现“运行时错误'13:类型不匹配”错误:Excel 粘贴多个单元格时类型不匹配,excel,vba,debugging,runtime-error,type-mismatch,Excel,Vba,Debugging,Runtime Error,Type Mismatch,我正在尝试将一个工时数据库粘贴到excel文件中,该文件将自动计算每项工作所用的时间和总工时。每次复制/粘贴一个单元格时,一切正常。当我尝试复制2个或多个单元格时,在以下位置出现“运行时错误'13:类型不匹配”错误: Tlen=Len(目标) 以下是我正在使用的屏幕截图视频: 我最终要做的是在视频的1:05。 从本质上说,我试图将数据库中的一块信息粘贴到我的excel文件中,并过滤掉任何与时间无关的内容。D列计算开始和停止时间之间的持续时间,E2将具有D列的总和。 我当前的代码: Privat
Tlen=Len(目标)
以下是我正在使用的屏幕截图视频:
我最终要做的是在视频的1:05。
从本质上说,我试图将数据库中的一块信息粘贴到我的excel文件中,并过滤掉任何与时间无关的内容。D列计算开始和停止时间之间的持续时间,E2将具有D列的总和。
我当前的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not IsNumeric(Target) Then
'do nothing
End If
If Not Intersect(Target, Range("a2:c900" & ThisWorkbook.Worksheets(1).UsedRange.Rows.Columns.Count)) Is Nothing Then
Tlen = Len(Target)
Targval = Target.Value
If Tlen = 1 Then
TimeV = TimeValue("00:" & Target)
ElseIf Tlen = 2 And Targval < 60 Then
TimeV = TimeValue("00:" & Target)
ElseIf Tlen = 2 And 60 <= Targval Then
'do nothing
ElseIf Tlen = 3 And Targval >= 160 And Targval <= 199 Or Targval >= 260 And Targval <= 299 Or Targval >= 360 And Targval <= 399 Or Targval >= 460 And Targval <= 499 Then
'do nothing
ElseIf Tlen = 3 And Targval >= 560 And Targval <= 599 Or Targval >= 660 And Targval <= 699 Or Targval >= 760 And Targval <= 799 Or Targval >= 860 And Targval <= 899 Then
'do nothing
ElseIf Tlen = 3 And Targval >= 960 And Targval <= 999 Then
'do nothing
ElseIf Tlen = 3 Then
TimeV = TimeValue(Left(Target, 1) & ":" & Right(Target, 2))
ElseIf Tlen = 4 And Targval >= 1060 And Targval <= 1099 Or Targval >= 1160 And Targval <= 1199 Or Targval >= 1260 And Targval <= 1299 Or Targval >= 1360 And Targval <= 1399 Then
'do nothing
ElseIf Tlen = 4 And Targval >= 1460 And Targval <= 1499 Or Targval >= 1560 And Targval <= 1599 Or Targval >= 1660 And Targval <= 1699 Or Targval >= 1760 And Targval <= 1799 Then
'do nothing
ElseIf Tlen = 4 And Targval >= 1860 And Targval <= 1899 Or Targval >= 1960 And Targval <= 1999 Or Targval >= 2060 And Targval <= 2099 Or Targval >= 2160 And Targval <= 2199 Then
'do nothing
ElseIf Tlen = 4 And Targval >= 2260 And Targval <= 2299 Or Targval >= 2360 And Targval <= 2399 Then
'do nothing
ElseIf Tlen = 4 And Targval < 2400 Then
TimeV = TimeValue(Left(Target, 2) & ":" & Right(Target, 2))
ElseIf Tlen >= 4 And Targval >= 2400 Then
'do nothing
End If
Target.NumberFormat = "HHMM"
Application.EnableEvents = False
Target = TimeV
Application.EnableEvents = True
End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
如果不是数字(目标),则
“什么也不做
如果结束
如果不相交(目标、范围(“a2:c900”&ThisWorkbook.Worksheets(1.UsedRange.Rows.Columns.Count))则为零
Tlen=Len(目标)
targetval=Target.Value
如果Tlen=1,则
TimeV=TimeValue(“00:”和目标)
ElseIf Tlen=2且Targval<60,则
TimeV=TimeValue(“00:”和目标)
ElseIf Tlen=2和60=560,Targval=660和Targval=760,Targval=1060和Targval=1160,Targval=1260和Targval=1360,Targval=1860和Targval=1960,Targval=2060和Targval=2160,Targval=4和Targval>=2400
“什么也不做
如果结束
Target.NumberFormat=“HHMM”
Application.EnableEvents=False
目标=时间V
Application.EnableEvents=True
如果结束
端接头
如果提供的代码没有示例数据和预期结果,那么您现有的代码会有点混乱,但我相信这正是您要做的
从基数10中提取一个1到4位数的数字,并将其转换为HHMM格式的时间
Private子工作表\u更改(ByVal目标作为范围)
如果不相交(目标、范围(“a:c”),那么Me.UsedRange就什么都不是了
错误转到安全出口
Application.EnableEvents=False
调光范围
对于相交中的每个t(目标、范围(“a:c”)、Me.UsedRange)
如果是数字(t)和LCase(t.NumberFormat)“hhmm”和LCase(t.NumberFormat“[hh]mm”),则
t、 NumberFormat=“[hh]mm”
t=时间序列(Int(t.Value/100),(t.Value Mod 100),0)
“候补的
't=时间序列(Int(val(t.text)/100),(val(t.text)Mod 100),0)
't.NumberFormat=“[hh]mm”
如果结束
下一个t
如果结束
安全出口:
Application.EnableEvents=True
端接头
如果目标不是数字,您不应该退出Sub吗?无论目标是什么,该代码都会继续运行。是要处理目标中的每个单元格还是跳过所有处理?当您检查目标和感兴趣范围的相交时,您应该只处理来自相交的返回值,以防多单元格目标的某些单元格超出了您要检查的范围。@TimWilliams,那个Intersect是非常讨厌的。用我当前代码的视频更新了我的帖子,以及我正在努力完成的事情。这几乎完全符合我的要求,只是每当输入一个不是正常时间值的数字(比如1969,2500)时,下面添加的条目就会出错(输入1900会变成4569000)。我尝试向您的代码中添加“每当target.value达到>2400时不执行任何操作”,这与我在原始代码中遇到的类似,但它无法解决问题。1900变为1900(07:00 pm);1969年变为2009年(08:09下午或19小时+69分钟;2500年变为2500年(1天1小时)。我看不出问题所在。如果您收到4569000,则您可能输入的是日期时间,而不是时间。请提供样本数据和预期结果,注意任何对您明显但对我来说不明显的限制。我不确定我做错了什么。我将您的原始代码复制并粘贴到VBA中。我在您的I最初的答案现在在编辑时更加不可预测。如果我将“1597”输入A1单元格,它将变成“1537”(下午3:37)。如果我将“1900”输入A2单元格或范围内的任何其他单元格,单元格将变成“456000”我必须重新打开一个新的excel工作表,并重新粘贴代码以阻止这种情况发生。通过您最近的编辑,我发布了一个屏幕记录,以显示发生了什么:好的,我明白了。系统认为您键入的是日期,因此在尝试将1900转换为时间格式之前,它会将1900转换为类似1/1/1900的格式列的格式为数字,您应该可以使用。奇怪的是,当列的格式为常规时,我的系统没有尝试相同的转换。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("a:c"), Me.UsedRange) Is Nothing Then
On Error GoTo safe_exit
Application.EnableEvents = False
Dim t As Range
For Each t In Intersect(Target, Range("a:c"), Me.UsedRange)
If IsNumeric(t) And LCase(t.NumberFormat) <> "hhmm" And LCase(t.NumberFormat <> "[hh]mm") Then
t.NumberFormat = "[hh]mm"
t = TimeSerial(Int(t.Value / 100), (t.Value Mod 100), 0)
'alternate
't = TimeSerial(Int(val(t.text) / 100), (val(t.text) Mod 100), 0)
't.NumberFormat = "[hh]mm"
End If
Next t
End If
safe_exit:
Application.EnableEvents = True
End Sub