小编Ins*_*ast的帖子

什么时候应该杀死Excel VBA变量或将其设置为Nothing?

在过去的两年里,我一直在教自己Excel VBA,我认为有时候在代码段的末尾处理变量是合适的.例如,我已经看到它改编自Ron de Bruin将Excel转换为HTML的代码:

Function SaveContentToHTML (Rng as Range)

        Dim FileForHTMLStorage As Object
        Dim TextStreamOfHTML As Object
        Dim TemporaryFileLocation As String
        Dim TemporaryWorkbook As Workbook

...

        TemporaryWorkbook.Close savechanges:=False
        Kill TemporaryFileLocation
        Set TextStreamOfHTML = Nothing
        Set FileForHTMLStorage = Nothing
        Set TemporaryWorkbook = Nothing

End Function
Run Code Online (Sandbox Code Playgroud)

我已经对此进行了一些搜索,发现除了如何做之外几乎没有什么,并且在一个论坛中发布了一个声明,即不需要清除局部变量,因为它们不再存在于End Sub.我猜测,基于上面的代码,可能不是真的End Function,或者在我没有遇到过的其他情况下.

所以我的问题归结为:

  • 网上有什么地方可以解释变量清理的时间和原因,而我还没有找到它?

如果没有,请有人在这里解释......

  • 何时需要对Excel VBA进行变量清理,何时不进行?
  • 更具体地说......是否存在特定的变量用法(公共变量?函数定义的变量?),它们在内存中加载的时间比sub要长,如果我不自行清理,可能会造成麻烦?

variables excel vba excel-vba

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

如何通过VBA获取当前Excel实例的进程ID,而不使用标题?

如何获取运行我的VBA代码的当前Excel实例的进程ID?我不想在标题,这会导致问题,当我有相同的标题两个或两个以上的Excel情况下要求它由名称.

excel vba pid excel-vba

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

SenderEmailAddress属性不包含内部联系人的标准电子邮件地址

背景:

使用Outlook规则触发脚本,我希望收到来自某些高可见性客户端的所有电子邮件后立即打开.

我已成功设置一条规则,当这些客户端向我发送电子邮件时会触发该规则 它看起来像这样:

来自乔布斯和沃兹尼亚克的电子邮件

我已经成功创建了一个脚本,可以打开对电子邮件的回复,具体取决于发送者是谁.它看起来像这样:

Sub OpenEmailImmediately(oEmail As Outlook.MailItem)

    Select Case oEmail.Sender
        Case "Jobs, Steve"
            oEmail.Reply.Display
    End Select

End Sub
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但我已经使用.Sender属性实现了它.

问题:

更愿意使用发件人的电子邮件地址(与我收到的每封电子邮件相关联的唯一值)实现此目的.不幸的是,oEmail.SenderEmailAddress我希望它包含电子邮件地址,仅适用于外部客户端.

在进行故障排除时,我发现我预计oEmail.SenderEmailAddress会有类似于此的值:

steve.jobs@apple.com

对于内部电子邮件,它具有与此类似的值:

/ O = APPLE/CN = RECIPIENTS/CN = JOBSS6738

题:

有没有办法可以使用标准电子邮件地址使这个脚本适用于内部外部?

实施解决方案的代码:

使用下面的Dmitry答案,代码被修改为使用电子邮件地址:

Sub OpenEmailImmediately(oEmail As Outlook.MailItem)

    If oEmail.SenderEmailType = "EX" Then
        Select Case oEmail.Sender.GetExchangeUser().PrimarySmtpAddress
            Case "steve.jobs@apple.com"
                oEmail.Reply.Display
        End Select
    Else
        Select Case oEmail.SenderEmailAddress
            Case "tom.brady@patriots.com"
                oEmail.Reply.Display
        End Select
    End If

End Sub
Run Code Online (Sandbox Code Playgroud)

vba outlook-vba outlook-2010

4
推荐指数
1
解决办法
4942
查看次数

使用Workbook.打开已知文件位置会导致"无法找到运行时错误1004 <file>"

我正在构建一个实用程序来从特定文件中获取数据并将该数据传输到另一个文件.源文件都具有相同的命名约定,其中包含一个相同的字符串,可用于将它们与目录中的其他文件区分开来.目的是使用带有通配符的字符串打开文件并提取所需的数据.

我在Workbook.Open昨天咨询了这个StackOverflow帖子Office开发中心的这个条目之后,我以为我曾经使用过通配符,但今天我尝试运行我的测试代码并且VBA声称没有找到该文件(尽管文本另有说明).

我的测试代码没有太大问题:

Dim strFilePath As String
    strFilePath = "C:\...\KMMacros\DeepLinkTransferFromSabaForm\"
Dim strFileName As String
    strFileName = "*SabaEntryForm.xlsx"

Workbooks.Open FileName:=Dir$(strFilePath & strFileName), ReadOnly:=True
Run Code Online (Sandbox Code Playgroud)

错误读取

找不到'TEST_KM6.7-3_BRSTA_SabaEntryForm.xlsx'.检查文件名的拼写,并验证文件位置是否正确.

和调试亮点

Workbooks.Open FileName:=Dir$(strFilePath & strFileName), ReadOnly:=True
Run Code Online (Sandbox Code Playgroud)

因为错误特别提到了我打算打开的文件,并且因为我的代码没有给出特定的文件名,所以VBA似乎找到了该文件,即使错误另有说明.

VBA如何找到该文件的名称,然后声称它无法找到它?我究竟做错了什么?

excel vba excel-vba

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

多维数组,用于存储和计数唯一ID的出现

背景:

为了更好地理解动态多维数组,我试图构建一个数组以捕获唯一值并计算唯一值的出现次数(我应该能够使用countif迅速验证这一点)。

在阅读有关尝试重新保存多维数组的imim时,我读到只能重新对最后一个参数进行imim,因此我尝试设置2个参数,其中第一个是唯一值,第二个是count:arr (2,k)。如果我的理解是错误的,那也很重要。

我将把数组的最终输出放入第3列(唯一ID)和第4列(出现次数)中。


问题:

将值添加到数组时,我无法收集所有唯一值。当数据中有6个值,并且每个值的出现都保持为1时(例如不进行迭代),我已经能够收集3个唯一值。


题:

我很抱歉这实际上是2个问题...

  • 1)我对redim保存器arr(2,0到k)的使用是否合适?

  • 2)我的动态数组生成是否存在明显问题,这可以解释为什么我没有捕获所有唯一值?

我可能会问三分之一关于为什么我无法使发生次数起作用的原因,但是我希望,如果我理解了上述问题,我有望在这一部分中奋斗。


数据如下所示:

所有数据均在A列中

cat
dog
mouse
cat
mouse
bear
frog
cat
moose
cat
dog
Run Code Online (Sandbox Code Playgroud)

有问题的代码:

Option Explicit

Private Sub unique_arr()
    Dim arr As Variant, i As Long, lr As Long, k As Long
    lr = Cells(Rows.Count, 1).End(xlUp).Row
    ReDim arr(2, k)
    For i = 1 To lr
        If Application.IfError(Application.Match(Cells(i, 1).Value, arr, 0), 0) = 0 Then
            ReDim Preserve arr(2, 0 To k)
            arr(1, k) = Cells(i, 1).Value
            arr(2, k) = …
Run Code Online (Sandbox Code Playgroud)

excel vba

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

如果在VBA中构建

在代码中找到以下字符串:

Dim lng As Long
...
If lng Then
...
End If
Run Code Online (Sandbox Code Playgroud)

这种情况是什么意思?lng将输入什么值If?什么值可以避免呢?

非常感谢!

vba

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

标签 统计

vba ×6

excel ×4

excel-vba ×3

outlook-2010 ×1

outlook-vba ×1

pid ×1

variables ×1