为什么这个 int 数理逻辑现在不再是 VBA 中的 int 了?
Why is this int mathematical logic now no longer an int in VBA?
所以我在 excel 上制作了 (并且有效) 一个简单的宏,只需打开另一个 excel 文件,然后转到选定的单元格并转到末尾 (在正确的方向),以获取最新填充的单元格 (因为每个月扩展 1)。
我需要得到 2 分,结束和结束是什么 - 73 有一个范围,在我选择了最新的单元格之后,我得到了列号 (即。A = 1, 6 = f etc...),然后我再次调用一个函数将其解析为 return 列字母。
在执行此操作时,我遇到了一些逻辑上让我感到困惑并且无法弄清楚为什么会发生这种情况的事情,所以我希望那里的专家可以向我解释一下。
正如您将在代码中看到的那样,我声明了 2 个整数;
- 开始
- 鳍
到达我想要的单元格后,我将 fin = 设置为 ActiveCell 列。
然后我就简单地做 ;
Start = fin - 73
但是当我调用函数 ConvertToLetter 时,我在通过 start 时遇到了类型不匹配错误,所以我强制通过;
ref1 = ConvertToLetter(CInt(start))
而且效果很好。
完整代码;
Sub Test()
Dim rng As Range
Dim start, fin As Integer
Dim ref1, ref2 As String
Dim file, tabn As String
Dim XL As Object
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Set rng = Range("C149")
file = "<File name>"
tabn = "<Tab Name>"
Set XL = CreateObject("Excel.Application")
XL.Application.Visible = True
XL.AskToUpdateLinks = False
XL.DisplayAlerts = False
XL.Application.Workbooks.Open (file)
Set wkb = XL.ActiveWorkbook
Set wks = wkb.Sheets(tabn)
wks.Activate
Set rng = wks.Range("C149")
rng.Select
rng.End(xlToRight).Select
fin = XL.ActiveCell.Column
start = fin - 73
If VarType(start) = vbInteger Then Debug.Print "Its an int!"
If VarType(start) = vbLong Then Debug.Print "Its a long!"
If VarType(start) = vbSingle Then Debug.Print "Its a single?"
If VarType(start) = vbDouble Then Debug.Print "ew double"
wkb.Close
XL.AskToUpdateLinks = True
XL.DisplayAlerts = True
XL.Quit
Set rng = Range("a1")
rng.Select
ref1 = ConvertToLetter(CInt(start))
ref2 = ConvertToLetter(fin)
End Sub
Function ConvertToLetter(iCol As Integer) As String
Dim iAlpha As Integer
Dim iRemainder As Integer
iAlpha = Int(iCol / 27)
iRemainder = iCol - (iAlpha * 26)
If iAlpha > 0 Then
ConvertToLetter = Chr(iAlpha + 64)
End If
If iRemainder > 0 Then
ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
End If
End Function
请原谅格式和丑陋的 if 语句(那只是为了让自己放心 start 是一个 int
令我困惑的是,当它通过 if 语句时,returned
"Its an int!"
那为什么让 start 的函数没有被解析呢?
我设法避免了
ref1 = ConvertToLetter(CInt(start))
一般来说,如果我事先应用了这个
Before:
start = fin - 73
After:
start = (fin - 73)
而且我不再需要使用 CINT 来解析它。
但是有人可以解释为什么它认为 start 不是 int 吗?为什么要将它封装在括号中呢?
因为我的脑子里有这样的逻辑;
例如,如果您有 2 个整数,并对它们应用任何数学问题,结果将始终是一个整数;
10 / 3 = 3,不是 3.33333333
那么为什么在这种情况下它不是一个整数?
非常感谢。
在您的声明中:
Dim start, fin As Integer
start
是 Variant
,而不是 int
。做:
Dim start As Integer, fin As Integer
如果您想了解一种变量类型,请像这样使用 TypeName 检查它:
Public Sub TestVar()
Dim a, b As Integer
Debug.Print TypeName(a)
Debug.Print TypeName(b)
End Sub
所以我在 excel 上制作了 (并且有效) 一个简单的宏,只需打开另一个 excel 文件,然后转到选定的单元格并转到末尾 (在正确的方向),以获取最新填充的单元格 (因为每个月扩展 1)。
我需要得到 2 分,结束和结束是什么 - 73 有一个范围,在我选择了最新的单元格之后,我得到了列号 (即。A = 1, 6 = f etc...),然后我再次调用一个函数将其解析为 return 列字母。
在执行此操作时,我遇到了一些逻辑上让我感到困惑并且无法弄清楚为什么会发生这种情况的事情,所以我希望那里的专家可以向我解释一下。
正如您将在代码中看到的那样,我声明了 2 个整数;
- 开始
- 鳍
到达我想要的单元格后,我将 fin = 设置为 ActiveCell 列。 然后我就简单地做 ;
Start = fin - 73
但是当我调用函数 ConvertToLetter 时,我在通过 start 时遇到了类型不匹配错误,所以我强制通过;
ref1 = ConvertToLetter(CInt(start))
而且效果很好。
完整代码;
Sub Test()
Dim rng As Range
Dim start, fin As Integer
Dim ref1, ref2 As String
Dim file, tabn As String
Dim XL As Object
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Set rng = Range("C149")
file = "<File name>"
tabn = "<Tab Name>"
Set XL = CreateObject("Excel.Application")
XL.Application.Visible = True
XL.AskToUpdateLinks = False
XL.DisplayAlerts = False
XL.Application.Workbooks.Open (file)
Set wkb = XL.ActiveWorkbook
Set wks = wkb.Sheets(tabn)
wks.Activate
Set rng = wks.Range("C149")
rng.Select
rng.End(xlToRight).Select
fin = XL.ActiveCell.Column
start = fin - 73
If VarType(start) = vbInteger Then Debug.Print "Its an int!"
If VarType(start) = vbLong Then Debug.Print "Its a long!"
If VarType(start) = vbSingle Then Debug.Print "Its a single?"
If VarType(start) = vbDouble Then Debug.Print "ew double"
wkb.Close
XL.AskToUpdateLinks = True
XL.DisplayAlerts = True
XL.Quit
Set rng = Range("a1")
rng.Select
ref1 = ConvertToLetter(CInt(start))
ref2 = ConvertToLetter(fin)
End Sub
Function ConvertToLetter(iCol As Integer) As String
Dim iAlpha As Integer
Dim iRemainder As Integer
iAlpha = Int(iCol / 27)
iRemainder = iCol - (iAlpha * 26)
If iAlpha > 0 Then
ConvertToLetter = Chr(iAlpha + 64)
End If
If iRemainder > 0 Then
ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
End If
End Function
请原谅格式和丑陋的 if 语句(那只是为了让自己放心 start 是一个 int
令我困惑的是,当它通过 if 语句时,returned "Its an int!"
那为什么让 start 的函数没有被解析呢?
我设法避免了
ref1 = ConvertToLetter(CInt(start))
一般来说,如果我事先应用了这个
Before:
start = fin - 73
After:
start = (fin - 73)
而且我不再需要使用 CINT 来解析它。
但是有人可以解释为什么它认为 start 不是 int 吗?为什么要将它封装在括号中呢?
因为我的脑子里有这样的逻辑;
例如,如果您有 2 个整数,并对它们应用任何数学问题,结果将始终是一个整数; 10 / 3 = 3,不是 3.33333333
那么为什么在这种情况下它不是一个整数?
非常感谢。
在您的声明中:
Dim start, fin As Integer
start
是 Variant
,而不是 int
。做:
Dim start As Integer, fin As Integer
如果您想了解一种变量类型,请像这样使用 TypeName 检查它:
Public Sub TestVar()
Dim a, b As Integer
Debug.Print TypeName(a)
Debug.Print TypeName(b)
End Sub