0

所以我在 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 语句时,它返回“Its an int!”

那么为什么不解析 let 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 呢?

非常感谢。

4

2 回答 2

1

在您的声明中:

Dim start, fin  As Integer

startVariant,不是int。做:

Dim start As Integer, fin  As Integer
于 2016-04-14T11:07:06.603 回答
0

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

Public Sub TestVar()

    Dim a, b As Integer

    Debug.Print TypeName(a)
    Debug.Print TypeName(b)

End Sub
于 2016-04-14T11:45:24.747 回答