关于Excel:是否定义了变量?

Is variable defined?

问:当Option Explicit打开时,如何查看Excel中是否存在/声明了变量?

我在一个文本文件中搜索一个模式,当它找到它时,它会检索该模式的位置(左边的字符长度)。每次找到模式时都会发生这种情况。当它没有找到这个模式时,它应该分配一个变量(例如:80)。

我在网上找到的解决方案(IsEmpty, TypeName都要求Option Explicit关闭,我真的希望它能继续运行。我在考虑声明匹配项并给它们一个默认值0,然后检查该值是否大于0。问题是我不知道可能有多少个匹配项,因此我不知道应该定义多少个匹配项。

文本文件的格式如下:

1
2
3
4
                                     2012        2011
title 1                              123,342     123,435
title 2                              234,431     645,234
title 3                              324,234        -

脚本读取每一行并将数据提取到列中(基于年份)。它通过找到一个模式(" [0-9]")来实现这一点,然后在该模式出现时进行查找。这一切都很好,但是如果找不到模式(如"标题3-2011"),脚本就会停止。(注意:"-"也可以是空格,或"--"或几乎任何东西)。

下面是我现在的代码摘录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
**Top of document**
Dim re As Object, matches As Object, match As Object, submatch
Dim iNoColumns As Integer, ii As Integer, NumberMatch As Variant
Dim sLine As String
**

ReDim iColumns(1 To iNoColumns) As Integer

          Set re = CreateObject("vbscript.regexp")                  
              re.Pattern =" [0-9]"
              re.IgnoreCase = True
              re.Global = True
Set matches = re.Execute(sLine)
For Each match In matches
   NumberMatch = match
Next

If VBA.InStr(1, sLine, NumberMatch) > 0 Then
   iColumns(1) = VBA.InStr(1, sLine, matches(0).Value)
   For ii = 2 To iNoColumns
      If matches(ii - 1).Value Is Nothing Then
        iColumns(ii) = 70 + (ii * 10)
      Else
        iColumns(ii) = VBA.InStr(iColumns(ii - 1) + 1, sLine, matches(ii - 1).Value)
        Debug.Print"Column" & ii &" starts at:" & iColumns(ii)
      End If
   Next ii
End If

主要是关于EDCX1〔4〕部分。这是一个不起作用的部分,我不知道该怎么做来修复它。除了匹配(1)或匹配(2)或匹配(3)(等)不存在之外,代码的其余工作非常有效。

如果我必须定义或解释上面使用的任何变量,请告诉我。

  • sLine是当前行(使用Scripting.FileSystemObject在文本文件中读取)
  • iNoColumns是列数(这决定了需要多少个匹配项:如果有2列,脚本将查找两个匹配项(匹配项(0)和匹配项(1))。
  • iColumns(ii)是每列的长度;由找到匹配的位置决定。

我试过这个stackoverflow解决方案(及其所有组合),也试过IsNullTypeName以字符串形式返回matches(ii - 1).Value


VBA(源):

1
2
3
4
5
6
| Type                                 | Test                            | Test2
| Numeric (Long, Integer, Double etc.) | If obj.Property = 0 Then        |
| Boolen (True/False)                  | If Not obj.Property Then        | If obj.Property = False Then
| Object                               | Is obj.Property Is Nothing Then |
| String                               | If obj.Property ="" Then       | If LenB(obj.Property) = 0 Then
| Variant                              | If obj.Property = Empty Then    |

或恩德兰解决方案(这篇文章)。

javascript(源):

1
2
3
if(typeof variable_here === 'undefined'){  
   // your code here.  
 };

1
2
3
if(! variable_here){  
   // your code here.  
 };

菲顿(来源):

1
2
3
4
5
6
try:
  thevariable
except NameError:
  print"well, it WASN'T defined after all!"
else:
  print"sure, it was defined."

或(源)要检查局部变量的存在:

1
2
if 'myVar' in locals():
  # myVar exists.

要检查全局变量的存在:

1
2
if 'myVar' in globals():
  # myVar exists.

要检查对象是否具有属性:

1
2
if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.

其他:检查变量是否在python中定义的简单方法?如何检查变量是否存在?.


1
2
3
For Each match In matches
   NumberMatch = match
Next

首先,这真的是你想要的吗?您是否只希望设置EDOCX1中的最后一个对象(无论前面的对象是什么)?

其次,执行以下操作:

1
2
3
dim matches As Variant

If matches(ii - 1) ="" Then

这应该可以解决这个问题(您可能需要包含一个或语句来检查它是否等于0)。