gpt4 book ai didi

excel - 在excel vba中重置变量

转载 作者:行者123 更新时间:2023-12-04 22:03:02 25 4
gpt4 key购买 nike

我正在尝试使用 VBA 构建一个模型,为我做一些工作。假设我有 4 个变量 - 单位、租赁开始日期、租赁 p.a 和替代租赁 p.a。还有更多,但这对我的问题无关紧要。 VBA 循环遍历每一行并获取相应列中单元 i 的值。

因此,从逻辑上讲,我可以将 unit 声明为字符串,将租约开始日期声明为 date,将租约 p.a 声明为单一,而将替代租约 p.a.作为单例。我遇到的问题是我需要区分空条目和0。默认数值将为0。0和空之间的区别至关重要。我发现解决这个问题的唯一方法是将所有内容声明为 Variant,然后检查相应的范围是否为空。如果为空,则租用 Variant 默认值(Empty),否则赋值。

我有一种感觉,这将严重影响我的代码性能。最终,会有很多变量,我想在代码中引用这些变量。喜欢,if isempty(AltLease) = true then做一件事,否则做另一件事。

我还发现我不能清空单个或日期变量(日期实际上不是问题,因为它下降到 1900)。任何人都可以提出一些建议吗?

这是代码:

Dim tUnitName As Variant
Dim tNumberOfUnits As Variant
Dim tLeaseCurLeaseLengthDef as Variant
Dim tLeaseCurLeaseLengthAlt as Variant


Sub tenancyScheduleNew()
Dim lRow As Long
Dim i As Long
lRow = Sheet2.Cells(Rows.Count, 2).End(xlUp).Row
For i = 3 To lRow
reAssignVariables i
Next i
End Sub

Sub reAssignVariables(i As Long)
tAssetName = checkIfEmpty(i, getColumn("Sheet4", "tAssetName", 3))
tNumberOfUnits = checkIfEmpty(i, getColumn("Sheet4", "tNumberOfUnits", 3))
tLeaseCurLeaseLengthDef = checkIfEmpty(i, getColumn("Sheet4", "tLeaseCurLeaseLengthDef", 3))
tLeaseCurLeaseLengthDef = checkIfEmpty(i, getColumn("Sheet4", "tLeaseCurLeaseLengthAlt", 3))

End Sub

Function getColumn(sh As String, wh As String, colNo As Long) As Long
Dim refSheet As Worksheet
Dim rFound As Range
Set refSheet = Sheets(sh)
With refSheet
Set rFound = .Columns(1).Find(What:=wh, After:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole)
On Error GoTo 0
If Not rFound Is Nothing Then
getColumn = rFound.Offset(0, colNo - 1).Value
Else
End If
End With

End Function

这就是我现在这样做的方式,我认为这会降低性能。这只是我所做的变量的一小部分——还会有更多。我只需要首先了解如何正确构建它。更具体地说,如果 tLeaseCurLeaseLengthAlt 中有一个值,那么代码应该使用它,或者使用默认值。

最佳答案

您不能清空整数类型的变量,因为空不是整数。如果您有一个当前是整数子类型的变体变量,您可以将其重置为空:

Sub test()
Dim v As Variant
Debug.Print TypeName(v)
v = 1
Debug.Print TypeName(v)
v = Empty
Debug.Print TypeName(v)
End Sub

输出:
Empty
Integer
Empty

此外,使用变体对性能的影响可能没有您担心的那么大。非正式测试:
Sub InformalTest(n As Long)
Dim i As Long, sum1 As Double
Dim j As Variant, sum2 As Variant
Dim start As Double, elapsed1 As Double, elapsed2 As Double

start = Timer
For i = 1 To n
sum1 = sum1 + 1#
Next i
elapsed1 = Timer - start

start = Timer
For j = 1 To n
sum2 = sum2 + 1#
Next j
elapsed2 = Timer - start

Debug.Print "Nonvariant time: " & elapsed1 & ", Nonvariant sum: " & sum1
Debug.Print "Variant time: " & elapsed2 & ", Variant sum: " & sum2
End Sub

样本输出:
InformalTest 1000000
Nonvariant time: 0.060546875, Nonvariant sum: 1000000
Variant time: 0.099609375, Variant sum: 1000000

InformalTest 10000000
Nonvariant time: 0.521484375, Nonvariant sum: 10000000
Variant time: 0.599609375, Variant sum: 10000000

关于excel - 在excel vba中重置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31022402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com