【问题标题】:Why is this int mathematical logic now no longer an int in VBA?为什么这个 int 数学逻辑现在不再是 VBA 中的 int 了?
【发布时间】: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


    【解决方案1】:

    在您的声明中:

    Dim start, fin  As Integer
    

    startVariant,而不是 int。做:

    Dim start As Integer, fin  As Integer
    

    【讨论】:

    • Ahhh 从来不知道这一点,假设它与其他语言(如 java)具有相同的语法,您可以在一行中声明多个相同数据类型的变量,以逗号分隔。感谢您的澄清:)
    【解决方案2】:

    如果您想知道一种变量类型,请使用 TypeName 进行检查,如下所示:

    Public Sub TestVar()
    
        Dim a, b As Integer
    
        Debug.Print TypeName(a)
        Debug.Print TypeName(b)
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多