【发布时间】:2016-04-14 11:00:39
【问题描述】:
所以我在 excel 上制作了 (并且有效) 一个简单的宏,以简单地打开另一个 excel 文件,然后转到选定的单元格并转到末尾 (在正确的方向上),获取最新填写的单元格(因为它每个月扩展 1)。
我需要得到 2 分,结尾和结尾是什么 - 73 有一个范围,在我选择了最新的单元格后,我得到了列号 (即 A = 1、6 = f 等...),然后我调用一个函数来解析它以再次返回列字母。
在执行此操作时,我遇到了一些逻辑上让我感到困惑并且无法弄清楚为什么会发生这种情况的事情,所以希望那里的专家可以向我解释一下。
正如您将在代码中看到的,我声明了 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 语句时,它返回了 “它是一个整数!”
那么为什么不解析让 start 的函数呢?
我设法避免了
ref1 = ConvertToLetter(CInt(start))
一般来说,如果我事先应用了这个
Before:
start = fin - 73
After:
start = (fin - 73)
我不再需要使用 CINT 解析它。
但是有人可以解释为什么它不认为 start 是一个 int 吗?为什么将它封装在括号中呢?
因为我的脑袋我有这个逻辑;
例如,如果您有 2 个 int,并对它们应用任何数学问题,则结果将始终是 int; 10 / 3 = 3,不是 3.33333333
那么为什么在这种情况下它不是 int 呢?
非常感谢。
【问题讨论】:
标签: vba math int logic forcing