2011-03-30 54 views
4

最近有很多愚蠢的问题,但我会很感激这一个输入。 我有一个来自INI文件的字符串。它看起来像Firstname=FIRSTNAME。这基本上是一个具有这些负载的数组。我想分解这些,但保留它们。所以,我设法把Firstname放在它自己的阵列中,并且它自己的就是FIRSTNAME。但是我的一位同事说:“为什么不用多维数组呢?”。这让我想,把Firstname设置为0,FIRSTNAME设置为1.但是我该怎么做?VBA - 使用多维数组而不是两个单独的数组?

这是现在我的代码:

For iTeller = 0 To UBound(arrIniName) 
     If Not arrIniName(iTeller) = "" Then 
      arrIniName(iTeller) = Split(arrIniName(iTeller), "=")(0) 
     End If 
    Next 

    For iTeller = 0 To UBound(arrIniValue) 
     If Not arrIniValue(iTeller) = "" Then 
      arrIniValue(iTeller) = Split(arrIniValue(iTeller), "=")(1) 
     End If 
    Next 

两个arrIniName和arrIniValues由完全相同的数组开始的。看起来像这样:

arrIniName(0) "Fistname=FIRSTNAME" 
arrIniName(1) "Lastname=LASTNAME" 
arrIniName(2) "Initials=INITIALS" 

所以我基本上将每一个分割成他们自己的独立数组,就像我现在这样做。但是将它们放在多维数组中可能会更好?因为那样我就只有一个数组来管理,并且还可以通过一个For Each循环来拉取该数组。

编辑:最后我做它像这样,在Values是数组

For Each s In Values 
    Dim strName, strValue 
    s = Split(s, "=") 
    strName = s(0) 
    strValue = s(1) 

    'Run function strName, strValue 
Next 
+0

要回答这个问题什么是保存数据的最佳结构,这将有助于在读入数据后知道您想要使用名称/值对执行的操作。您想如何使用这些数据? – 2011-03-30 08:07:36

+0

我将通过一个创建'Scripting.Dictionary'条目的函数来运行它们。所以基本上,我只是想根据INI文件中的内容动态创建变量。稍后,我在基于FIRSTNAME的Word模板中查找书签,并在其中插入一个值。我只是希望它是动态的,所以我只需要更新ini文件并插入我想要的书签,而不必担心背后的代码就可以看到:)希望这是有道理的:p – 2011-03-30 08:11:33

+0

笑了 - 你的评论出现在我发布后我的答案。为什么不能从一开始就创建词典?我的意思是,为什么你需要一个临时数组来存储这些值,而不是直接将它们放在字典中? – 2011-03-30 08:13:19

回答

4

理想的解决方案听起来像持有键/值对的Dictionary(数据结构 - 正是你在你的INI文件)。

这里不需要多维数组,因为您只有2个维度(键和值)。由于阵列难以调整大小,所以阵列通常比字典更难以使用,所以您需要知道您有多少项目。

因此,我建议如下代码:

Dim dict As Dictionary 
Set dict = new Dictionary 
Dim key as String 
Dim value as String 

For iTeller = 0 To UBound(arrIniValue) 
    If Not arrIniValue(iTeller) = "" Then 
     key = Split(arrIniValue(iTeller), "=")(0) 
     value = Split(arrIniValue(iTeller), "=")(1) 
     dict.Add(key, value) 
    End If 
Next 

但是,如果你想使用一个多维数组,那么下面将做到这一点:

' Declare a 2-dimensional array, of dimensions "n by 2". 
Dim results(UBound(arrIniValue), 2) As String 

For iTeller = 0 To UBound(arrIniValue) 
    If Not arrIniValue(iTeller) = "" Then 
     key = Split(arrIniValue(iTeller), "=")(0) 
     value = Split(arrIniValue(iTeller), "=")(1) 
     results(iTeller, 0) = key 
     results(iTeller, 1) = value 
    End If 
Next 
+2

...如果您可以忍受普通ol'VBA.Collection的局限性,那么您可能想使用它来代替脚本。Dictionary,以减少您必须担心的外部依赖项的数量。 VBA.Collection在VBA中始终可用,不管其他什么是或未安装并正确注册。 – 2011-03-30 08:18:04

+0

好点 - 我是一个.NET开发人员,所以默认情况下我有一个丰富的库;-) – 2011-03-30 08:20:22

+0

我只是将其设置为答案并更新我的原始帖子,并显示我最终做了什么:) – 2011-03-30 08:22:32