Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
Excel 粘贴多个单元格时类型不匹配_Excel_Vba_Debugging_Runtime Error_Type Mismatch - Fatal编程技术网

Excel 粘贴多个单元格时类型不匹配

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

我正在尝试将一个工时数据库粘贴到excel文件中,该文件将自动计算每项工作所用的时间和总工时。每次复制/粘贴一个单元格时,一切正常。当我尝试复制2个或多个单元格时,在以下位置出现“运行时错误'13:类型不匹配”错误:

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