我在工作表上有一个数据字段,作为自定义数字格式
地理位置:[![![数据列示例][1]][1]
sum:[![![数据列示例][2]][2]
我将该字段与另一个工作表上的其他两个字段进行比较,以确定该字段是否介于这两个字段之间。因此,我得到了下面的代码,它使用数组的变体并沿空格拆分。我认为最好的方法是使用带有不等式的datevalue
和timevalue
函数,这两个函数都需要字符串。你知道为什么我在拆分时会出现类型不匹配错误吗?
更新:基于####注释和列引用错误,我自动调整了dateTime-co并更改了列引用。现在,我的sumfull
字符串获取列的文本。我在下一行仍然收到一个类型匹配错误。我已经更新了下面的代码。代码在sumsplit = Split(sumfull, " ")
处中断,出现类型不匹配错误。CCD_ 5的内容是";2022年1月23日18:53";。这也是sumfill断开时的值。
Option Explicit
Sub O_face()
Dim geo As Workbook
Dim sum As Workbook
Dim geowks As Worksheet
Dim sumwks As Worksheet
Dim i As Variant
Dim j As Variant
Dim lastrow As Long
Dim georng As Range
Dim sumrng As Range
Dim geofull As Date
Dim sumfull As Date
Dim sumfull2 As Date
Set geo = ThisWorkbook
Set sum = Workbooks.Open("MyFile.csv")
Set geowks = geo.Workshets(1)
geowks.Range("B:B").EntireColumn.AutoFit
Set sumwks = sum.Worksheets(1)
sumwks.Range("F:G").EntireColumn.AutoFit
lastrow = geowks.Cells(Rows.Count, "a").End(xlUp).Row
geowks.AutoFilterMode = False
geowks.Range("A1:L" & lastrow).AutoFilter Field:=5, Criteria1:="<>", Operator:=xlFilterValues
Set georng = geowks.Range("E2:E" & lastrow).SpecialCells(xlCellTypeVisible)
lastrow = sumwks.Cells(Rows.Count, "a").End(xlUp).Row
sumwks.AutoFilterMode = False
sumwks.Range("A1:P" & lastrow).AutoFilter Field:=3, Criteria1:="<>", Operator:=xlFilterValues
Set sumrng = sumwks.Range("C2:C" & lastrow).SpecialCells(xlCellTypeVisible)
'have to split the date time cell because it's a custome data type in the worksheet. Then compare the date and time seperately.....
For i = 1 To sumrng.Rows.Count
sumfull = sumrng.Cells(i, 4)
sumfull2 = sumrng.Cells(i, 5)
For j = 1 To georng.Rows.Count
geofull = georng.Cells(j, -2)
If sumrng(i, 1) = georng(j, 1) And _
geofull >= sumfull And geofull >= sumfull2 Then
sumrng.Cells(i, 15) = "IS THIS WHAT YOU WANT!!!!"
End If
End If
Next j
Next i
End Sub
(a(Split
返回一个字符串数组。您可以将结果分配给动态字符串数组或变量,请参阅https://stackoverflow.com/a/57113178/7599798。您尝试将其分配给VariantArray-这将失败。您也不需要设置该数组的维度,split
无论如何都会处理这个问题。那就是:
Dim sumsplit() As String
sumfull = CStr(sumrng.Cells(i.Row, "f").Text)
sumsplit = Split(sumfull)
(b(假设Excel中的数据是日期(而不是看起来像日期的字符串(,那么既没有理由将它们转换为字符串,也没有理由拆分该字符串以获得日期和时间部分。只需使用日期变量。在背景中,日期是浮点数字(=双精度(。小数点前的数字定义日期部分(自1989年12月31日起的天数(,其余部分定义时间。获取Excel日期的日期和时间:
Dim sumfull As Date, fsumdate As Date, fsumtime As Date
sumfull = sumrng.Cells(i.Row, "f").value
fsumdate = int(sumfull) ' Remove the digits after the decimal
fsumtime = sumFull-int(sumfull) ' The digits after the decimal is the Time.
(c(我不完全理解If语句的逻辑,但您可以简单地将日期变量与<
和>
进行比较——数字越大意味着日期/时间越晚。我认为您不需要分别比较日期和时间部分。也许这样可以:
Dim geoDate As Date, fsumDate As Date, lSumDate As Date
fsumDate = sumrng.Cells(i.Row, "f").value
lsumDate = sumrng.Cells(i.Row, "g").value
geoDate = georng.Cells(j.Row, "b").value
If geodate >= fsumdate And geodate <= lsumdate Then
(d(通常,应避免使用Text
-属性。如果由于任何原因单元格的宽度太小而不能显示日期,Excel将显示"######"相反,你会把这一点融入你的程序中。