VBA - 在循环中解析变量

VBA - Resolving Variables in a Loop

我正在使用 VBA 从 SharePoint 中提取 excel 书籍并将它们保存在指定的文件夹中,我需要提取大约 11 位分析师的工作簿。我宁愿不 copy/paste 我使用 11 次的公式,所以我试图将他们的名字存储在变量中,然后使用循环。我似乎无法让它正常工作。

这是我目前所拥有的示例:

    Sub DownloadTimeTrackers()
Dim i As Integer
Dim Name1 As String
Dim Name2 As String
Dim Name3 As String

Name1 = "Barb"
Name2 = "Alex"
Name3 = "Cole"

For i = 1 To 3 Step 1

Const strUrl As String = "mypath\Secured\Name(i) Time Tracker.xlsm"
Dim strSavePath As String
Dim returnValue As Long

 strSavePath = "C:\Users\lxys\Desktop\TimeTrack\Name(i) Time Tracker.xlsm"
 returnValue = URLDownloadToFile(0, strUrl, strSavePath, 0, 0)

Next I

End Sub

我排除了一些有助于从 SP 中提取报告的代码,但我认为它与此无关..

如果我用 Name(i) 代替实际名称 "Barb",公式运行良好,并保存到我的桌面文件夹。

如何获取 Name(i) 来代替 Barb、Alex、Cole 等?我试过 Namei、Name + i 和 Name(i),但没有成功。为什么这似乎无法正确解决的任何建议?我没有收到任何错误。

编辑:

根据反馈,我将程序更改为以下内容,但收到 "Subscript Out of Range" 错误:

    Sub DownloadTimeTrackers()
Dim i As Integer
Dim Name() As Variant
Dim strUrl As String

Name = Array("Barb", "Alex", "Cole", "Cim", "Adam", "Lane", "Kristin", "Mike", "Nicki", "George", "Lori")


For i = 1 To 11 Step 1

        strUrl = "\collab.sfcollab.org@SSL\DavWWWRoot\sites\WSS005469\DisputeTeam\Secured\" & Name(i) & "Time Tracker.xlsm"

Dim strSavePath As String
Dim returnValue As Long

 strSavePath = "C:\Users\fip1\Desktop\TimeTrack\" & Name(i) & "Time Tracker.xlsm"
 returnValue = URLDownloadToFile(0, strUrl, strSavePath, 0, 0)

Next i



End Sub

我发现了错误,我在“时间Tracker.xlsm”中没有space

而不是

Dim Name1 As String
Dim Name2 As String
Dim Name3 As String

Name1 = "Barb"
Name2 = "Alex"
Name3 = "Cole"

使用

Dim Name() As Variant
Name = Array("Barb", "Alex", "Cole")

这会创建一个 "array" 的名称,可以由您的变量 i 索引。请注意,默认情况下,此数组将从零开始,即第一个位置将为 Name(0)


你还需要改变

Const strUrl As String = "mypath\Secured\Name(i) Time Tracker.xlsm"

Dim strUrl As String
strUrl = "mypath\Secured\" & Name(i) & " Time Tracker.xlsm"

(你不能有一个具有不同值的 "constant")


并改变

strSavePath = "C:\Users\lxys\Desktop\TimeTrack\Name(i) Time Tracker.xlsm"

strSavePath = "C:\Users\lxys\Desktop\TimeTrack\" & Name(i) & " Time Tracker.xlsm"

您的重构代码将是

Sub DownloadTimeTrackers()
    Dim strUrl As String
    Dim strSavePath As String
    Dim returnValue As Long
    Dim i As Integer
    Dim Name() As Variant

    Name = Array("Barb", "Alex", "Cole")

    For i = LBound(Name) To UBound(Name)

        strUrl = "mypath\Secured\" & Name(i) & " Time Tracker.xlsm"
        strSavePath = "C:\Users\lxys\Desktop\TimeTrack\" & Name(i) & " Time Tracker.xlsm"
        returnValue = URLDownloadToFile(0, strUrl, strSavePath, 0, 0)

    Next i

End Sub

(我还更改了您的循环,从数组的下限转到上限。这样您就可以向数组添加额外的名称,而不必担心更改 For 语句。 )

问题在于缺少数组和路径:

要遍历名称,您需要将它们作为数组变量的一部分,而不是单独的字符串。

Dim Name() As String
Name = Array("Barb", "Alex", "Cole")

然后,您将路径定义为不变变量:

Const strUrl As String = "mypath\Secured\Name(i) Time Tracker.xlsm"
strSavePath = "C:\Users\lxys\Desktop\TimeTrack\Name(i) Time Tracker.xlsm"

字符串总是:

"mypath\Secured\Name(i) Time Tracker.xlsm"

"C:\Users\lxys\Desktop\TimeTrack\Name(i) Time Tracker.xlsm"

而不是遍历数组并按名称求值:

"..." Name(0) "..."

"..." Name(1) "..."

因为没有名称的迭代,因为 i 是文本字符串的一部分,而不是为您提供数组正确成员的变量实例化。你需要把它放在字符串外面并连接到它。

Const strUrl As String = "mypath\Secured\" & Name(i) & " Time Tracker.xlsm"

strSavePath = "C:\Users\lxys\Desktop\TimeTrack\"Name(i) & " Time Tracker.xlsm"