相关疑难解决方法(0)

如何在vba宏中检查空数组

我想检查空数组.Google给了我各种解决方案,但没有任何效果 也许我没有正确应用它们.

Function GetBoiler(ByVal sFile As String) As String
'Email Signature
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    GetBoiler = ts.ReadAll
    ts.Close
End Function

Dim FileNamesList As Variant, i As Integer
' activate the desired startfolder for the filesearch
FileNamesList = CreateFileList("*.*", False) ' Returns File names
' performs the filesearch, includes any subfolders
' present the result
' If there are Signatures then populate SigString
Range("A:A").ClearContents
For i = …
Run Code Online (Sandbox Code Playgroud)

excel vba excel-vba

57
推荐指数
6
解决办法
19万
查看次数

如何返回在VBA中传递给它的(Variant)变量的维数

有谁知道如何返回在VBA中传递给它的(Variant)变量的维数?

excel vba variant dimensions

28
推荐指数
5
解决办法
6万
查看次数

VBA:是什么导致传递给ParamArray的这个字符串参数变为一个数字(看起来像一个指针)?

最终编辑:它确实似乎是一个编译器错误 - 请参阅接受的答案.

在Excel 2007中使用VBA,我在'Class1'中有以下代码:

Option Explicit

Public Function strange(dummy As String, ParamArray pa())
    Debug.Print pa(LBound(pa))
End Function

Public Sub not_strange(dummy As String, ParamArray pa())
    Debug.Print pa(LBound(pa))
End Sub

Public Function also_not_strange(ParamArray pa())
    Debug.Print pa(LBound(pa))
End Function
Run Code Online (Sandbox Code Playgroud)

以及模块中的一些模式代码:

Option Explicit

Public Function not_strange_either(dummy As String, ParamArray pa())
    Debug.Print pa(LBound(pa))
End Function

Public Sub outer(v)
    Dim c As Class1
    Set c = New Class1

    Call c.strange("", v(LBound(v)))
    Call c.not_strange("", v(LBound(v)))
    Call c.also_not_strange(v(LBound(v)))

    Call not_strange_either("", v(LBound(v)))
End Sub
Run Code Online (Sandbox Code Playgroud)

如果从立即窗口调用'outer',如下所示:

call outer(array("a"))
Run Code Online (Sandbox Code Playgroud)

我得到了看起来很奇怪的输出: …

excel vba compiler-bug

11
推荐指数
1
解决办法
1457
查看次数

VBA数组切片(不是Pythonic意义)

我该如何实现这个功能?

Public Function ArraySlice(arr As Variant, dimension as Long, index as Long) As Variant

    'Implementation here

End Function
Run Code Online (Sandbox Code Playgroud)

假设我想要一个数组切片.我在该维度上指定了一个数组,一个维度和一个索引,我想要切片.

举一个具体的例子,假设我有以下5x4 2D数组

   0  1  2  3  4
  ______________
0| 1  1  2  3  1
1| 3  4  2  1  5
2| 4  5  3  2  6
3| 3  5  2  1  3
Run Code Online (Sandbox Code Playgroud)

如果水平尺寸为1且垂直尺寸为2,则返回值ArraySlice(array, 1, 3)将为1x4 2D阵列.选定的维度2被展平,唯一剩下的值是最初在维度2的索引3处的值:

   0
  ____
0| 3
1| 1
2| 2
3| 1
Run Code Online (Sandbox Code Playgroud)

你会如何在VBA中实现这一点?我能想到的唯一实现将涉及CopyMemory,除非我限制了允许的维度数量并对每种情况进行硬编码.

注意:这是我如何获得数组的尺寸

UPDATE

以下是一些操作示例

对于2D阵列

   0  1  2  3  4
  ______________
0| …
Run Code Online (Sandbox Code Playgroud)

arrays vba

8
推荐指数
1
解决办法
547
查看次数

VBA处理空数组错误

我正在编写一个脚本,它将循环遍历我的电子表格,并查找是否有任何重复的所选单元格.如果有重复,那么该函数将返回一个行是重复的数组,并创建一个注释告诉我哪些行是重复的.我已经能够处理错误0但是现在当我使用UBound函数检查数组中是否存在元素时,我得到错误9.有没有人知道如何验证整数数组,如果它是空的或不是因为我的代码似乎没有完成这项工作.以下是我的代码

Function IsArrayEmpty(anArray As Variant) As Boolean
    Dim i As Integer

    On Error Resume Next
        i = UBound(anArray, 1)
    Select Case (Err.Number)
        Case 0
            IsArrayEmpty = True
        Case 9
            IsArrayEmpty = True
        Case Else
            IsArrayEmpty = False
    End Select
End Function
Run Code Online (Sandbox Code Playgroud)

error-handling excel vba excel-2003

7
推荐指数
2
解决办法
3万
查看次数

创建一个空的二维数组

我不喜欢未初始化的 VBA 数组,因为每次使用之前都需要检查数组是否已初始化UBound()For Each避免异常,并且没有本机 VBA 函数来检查它。这就是为什么我初始化数组,至少用a = Array(). 这在大多数情况下消除了额外检查的需要,因此一维数组没有问题。

出于同样的原因,我尝试创建一个空的二维数组。不可能简单地做ReDim a(0 To -1, 0 To 0),转置一维空数组或类似的东西。我偶然遇到的唯一方法是使用MSForms.ComboBox,将空数组分配给.List属性并将其读回。这是在 Excel 和 Word 中工作的示例,您需要插入UserForm到 VBA 项目中,放置ComboBox在其上,并添加以下代码:

Private Sub ComboBox1_Change()

    Dim a()
    ComboBox1.List = Array()
    a = ComboBox1.List
    Debug.Print "1st dimension upper bound = " & UBound(a, 1)
    Debug.Print "2nd dimension upper bound = " & UBound(a, 2)

End Sub
Run Code Online (Sandbox Code Playgroud)

组合更改后的输出为:

1st dimension upper bound = -1
2nd …
Run Code Online (Sandbox Code Playgroud)

arrays excel vba multidimensional-array is-empty

6
推荐指数
2
解决办法
619
查看次数

VBA - 创建空数组

我有一个函数,它接受一个字符串数组并将每个字符串映射到一个Date实例。该函数归结为以下代码。

Private Function ParseDates(dates() As String) As Date()
  Dim res() As Date
  Dim i As Integer

  If UBound(dates) >= 0 Then
    ReDim res(UBound(dates)) As Date
  End If


  For i = LBound(dates) To UBound(dates)
    res(i) = #01/01/2000#
  Next i
  ParseDates = res
End Function
Run Code Online (Sandbox Code Playgroud)

只要参数datesnonempty ,该函数就可以正常工作。当dates为空时res不给定维度。因此,如果在循环中枚举结果,则返回值不可枚举,导致此函数的用户崩溃。

parsedDates = ParseDates(input) 
For i = 1 To UBound(parsedDates) ' Suscription out of range
  ...
Run Code Online (Sandbox Code Playgroud)

当日期为空时,如何实例化并返回一个空数组?

如果你打电话,Split("",".")你会收到一个类型为 的对象String(0 to -1)。我需要我的函数返回一个类型的对象,Date(0 …

arrays vba

5
推荐指数
1
解决办法
1万
查看次数

为什么在尝试将某个非IDispatch公开对象类型的数组分配给变量时,为什么要分配数组指针呢?

摘要

在为某个对象类型声明了一个数组(其中该类型不使用从COM的接口派生的接口(&因此未正确设置以启用[OLE] Automation的后期绑定技术))后,尝试根据我的期望将数组分配给变量不起作用。IDispatchVariant

具体而言,似乎发生的情况是将指向数组的积分指针分配给了Variant变量,而不是数组的副本。

谁能解释这种行为?这是VBA 7.1语言的标准行为吗?[EDIT-A1]是VBA的Variant类型不能处理此类数组吗?[EDIT-A2]


[EDIT-A1]- 当前(19年4月6日),看起来像是个错误。
[EDIT-A2]- 否,因为ByRef Variant如果将这样的数组作为此类参数的值传递,则参数的内部过程参数可以正确指向此类数组。



背景

有关正在发生的事情的更多详细信息

在检查了各种内存地址和指针之后,似乎正在发生的事情是,在将此类数组分配给Variant变量时,实际上是分配了指向数组“ VB安全数组指针”Long(或LongPtr)指针。这与VBA语言规范中此处记录的预期的行为相反。在查看有关VB数组及其内存布局的VB6文档(存储在此处)之后,我推断出发生了这种指针分配。

我对问题是否先前已被记录的研究

我搜索了Internet,Office VBA参考文档和VBA语言规范,以查看是否有人记录了此问题。我发现该问题可能已被部分记录的唯一地方是在此处发布的堆栈溢出答案中。不幸的是,该帖子没有对这个问题说太多。

我测试过的特定数组类型

我曾经历过与使用接口不下列对象类型的数组这个问题获得来自IDispatch

  • stdole.IUnknown *
  • stdole.IFont
  • mscoree.CorRuntimeHost
  • mscorlib.AppDomain
  • mscorlib.Type

*来自的OLE Automation COM类型库stdole2.tlb
†来自.NET Framework v4.0.30319的COM类型库。

关于使用不源自的接口的对象类型的更多信息 …

arrays com vba ole-automation iunknown

5
推荐指数
0
解决办法
153
查看次数

如何知道VBA中的字符串数组为空?

我将一个空的字符串数组变暗,但是如何获取该数组是否为空?我在下面尝试过,但不知道。

Sub arrtest()
  Dim myVar() As String
  Debug.Print VarType(myVar)   '8200
  Debug.Print TypeName(myVar)  'String()
  Debug.Print IsEmpty(myVar)   'False
  Debug.Print IsNull(myVar)    'False
  Debug.Print LBound(myVar)    'Error
  Debug.Print UBound(myVar)    'Error
  Debug.Print myVar Is Nothing 'Error
End Sub
Run Code Online (Sandbox Code Playgroud)

arrays vba

3
推荐指数
1
解决办法
3925
查看次数

如何用UBound <LBound制作VB6变体数组?

我试图摆脱对VB6应用程序中SCRRUN.DLL的依赖。它当前用于其中的一件事是其Dictionary类。Dictionary类具有一个Keys函数,该函数应该返回字典中的一个键数组。我做了一些实验,看看字典中没有键会发生什么:

Dim D As Dictionary
Set D = New Dictionary
Dim K() As Variant
K = D.Keys
MsgBox LBound(K) & ", " & UBound(K)
Run Code Online (Sandbox Code Playgroud)

我原以为“下标超出范围”或类似的内容,但是我却得知LBound为0,UBound为-1。

那么,如何创建具有LBound 0和UBound -1的Variant数组?

我试过只使用未初始化的变体数组:

Dim K() as Variant
MsgBox LBound(K) & ", " & UBound(K)
Run Code Online (Sandbox Code Playgroud)

但是,当然,正如我所期望的那样,这会使“下标超出范围”。删除未初始化的数组也是如此:

Dim K() as Variant
Erase K
MsgBox LBound(K) & ", " & UBound(K)
Run Code Online (Sandbox Code Playgroud)

与擦除初始化数组一样:

Dim K() As Variant
ReDim K(0 To 0)
Erase K
MsgBox LBound(K) & ", " & UBound(K)
Run Code Online (Sandbox Code Playgroud)

我还尝试过仅将其重新设置为0和-1,这看起来很奇怪:

Dim K() As Variant
ReDim K(0 To …
Run Code Online (Sandbox Code Playgroud)

arrays vb6 variant

2
推荐指数
1
解决办法
2773
查看次数

最佳实践VBA:非布尔函数的布尔返回值

我正在寻找一些有关编写函数的帮助,以便在VBA中返回一行多维数组.Cpearson在VBA中有一篇关于数组函数的非常广泛的文章,其中包含一系列具有许多优秀特性的函数库.在StackOverflow上的许多VBA数组问题中都引用了这篇文章.但是,我注意到cpearson因此使用了布尔函数.

示例:GetRow下面给出的函数是布尔函数,但我认为函数应该从给定的行号返回一维数组,类似于

Function RtrnArrayRow(SrcArr() As Variant, RowNumber As Integer) As Variant
Run Code Online (Sandbox Code Playgroud)

哪里RtrnArrayRow是一维数组.

问题:应用数组函数,布尔值或非布尔值以及如何最好地正确使用下面的布尔函数的最佳做法是什么?

所有的帮助都是适用的!

Function GetRow(Arr As Variant, ResultArr As Variant, RowNumber As Long) As Boolean
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GetRow
' This populates ResultArr with a one-dimensional array that is the
' specified row of Arr. The existing contents of ResultArr are
' destroyed. ResultArr must be a dynamic array.
' Returns True or False indicating success.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' …
Run Code Online (Sandbox Code Playgroud)

arrays excel vba excel-vba

2
推荐指数
1
解决办法
502
查看次数

VBA:当数组为空时不要进入循环

我有一个循环,看起来像这样:

For Each article In artAll
Next
Run Code Online (Sandbox Code Playgroud)

或者像这样:

For i = 0 To Ubound(artAll)
Next
Run Code Online (Sandbox Code Playgroud)

当数组长度为0时,我收到一条错误消息.当数组为空时跳过循环的好方法是什么?我怀疑我应该使用

On Error Goto
Run Code Online (Sandbox Code Playgroud)

但我需要帮助最终确定解决方案.

vba

1
推荐指数
2
解决办法
2万
查看次数