【问题标题】:Word vba - Read all values from INI file and put in arrayWord vba - 从 INI 文件中读取所有值并放入数组
【发布时间】:2011-03-17 06:03:30
【问题描述】:

好的,所以我有一堆 Word 模板,它们在 Document_New 上读取注册表中的一些值并将这些值插入到文档的书签中。到目前为止,我这样做的方式是首先从一个 INI 文件中读取,该文件指示模板中的书签被称为什么。这是逐行完成的,它再次被放入一个数组中。然后我遍历该数组并一一读取注册表。

现在,是否可以读取整个 INI 部分并直接将其放入数组中? 像这样?:

Dim strIniKey as String
strIniKey = INI key

If bookmark exists strIniKey Then
   pick up registry string from strIniKey
   Insert into bookmark
End if

然后循环遍历每个 INI 值?

这就是我现在的做法:

    Dim objShell
Dim strShell
Dim strDataArea
Dim Verdier() As String
Dim regPath
Dim regString
Dim Felter
Dim WScript

' Klargjør stringverdier fra INI-fil

regPath = ReadIni(File, "Registry", "Path")
regString = ReadIni(File, "Registry", "String")
regStrFornavn = ReadIni(File, strRegArea, "Fornavn")
regStrEtternavn = ReadIni(File, strRegArea, "Etternavn")
regStrInitialer = ReadIni(File, strRegArea, "Initialer")
regStrBrevnavn = ReadIni(File, strRegArea, "Brevnavn")
regStrStilling = ReadIni(File, strRegArea, "Stilling")
regStrStilling_EN = ReadIni(File, strRegArea, "Stilling_EN")
regStrAvdeling = ReadIni(File, strRegArea, "Avdeling")
regStrAvdeling_EN = ReadIni(File, strRegArea, "Avdeling_EN")
regStrEnhetoffnavn = ReadIni(File, strRegArea, "Enhetoffnavn")
regStrEnhetoffnavn_EN = ReadIni(File, strRegArea, "Enhetoffnavn_EN")
regStrVisitaddress1 = ReadIni(File, strRegArea, "Visitaddress1")
regStrVisitpostnrsted = ReadIni(File, strRegArea, "Visitpostnrsted")
regStrPostadresse1 = ReadIni(File, strRegArea, "Postadresse1")
regStrPostadresse2 = ReadIni(File, strRegArea, "Postadresse2")
regStrPostnrsted = ReadIni(File, strRegArea, "Postnrsted")
regStrLeveringsadresseNr = ReadIni(File, strRegArea, "LeveringsadresseNr")
regStrLeveringsadresseSted = ReadIni(File, strRegArea, "LeveringsadresseSted")
regStrTelesentralbord = ReadIni(File, strRegArea, "Telesentrbord")
regStrDirekteinnvalg = ReadIni(File, strRegArea, "Direkteinnvalg")
regStrMobil = ReadIni(File, strRegArea, "Mobil")
regStrTelefax = ReadIni(File, strRegArea, "Telefax")
regStrWebadresse = ReadIni(File, strRegArea, "Webadresse")
regStrSentrepostmottak = ReadIni(File, strRegArea, "Sentrepostmottak")
regStrEpost = ReadIni(File, strRegArea, "Epost")
regStrForetaksnr = ReadIni(File, strRegArea, "Foretaksnr")

'Klargjør array av alle verdier fra INI-fil
Felter = Array(regStrFornavn, regStrEtternavn, regStrBrevnavn, regStrInitialer, _
regStrStilling, regStrStilling_EN, regStrAvdeling, regStrAvdeling_EN, regStrEnhetoffnavn, _
regStrEnhetoffnavn_EN, regStrVisitaddress1, regStrVisitpostnrsted, regStrPostadresse1, _
regStrPostadresse2, regStrPostnrsted, regStrLeveringsadresseNr, regStrLeveringsadresseSted, _
regStrTelesentralbord, regStrDirekteinnvalg, regStrMobil, regStrTelefax, regStrWebadresse, _
regStrSentrepostmottak, regStrEpost, regStrForetaksnr)

这基本上创建了一个包含来自 INI 文件的值的数组。

代码继续获取数组的每个部分,并在书签中循环,搜索匹配项,然后从注册表中插入相应的值。

Set objShell = CreateObject("Wscript.Shell")

    For iTeller = 0 To UBound(Felter)
    Dim sBookMarkName, sVerdi
    Dim myRange As Range

    On Error Resume Next
    sBookMarkNametemp = "Bookmark" & Felter(iTeller)

    sVerdi = ""
    sVerdi = objShell.RegRead(regPath & "\" & Felter(iTeller))
    sBookMarkName = ""
    sBookMarkName = ActiveDocument.Bookmarks(sBookMarkNametemp).Name

    With ActiveDocument
        If .Bookmarks.Exists(sBookMarkNametemp) Then
        Set myRange = .Bookmarks(sBookMarkName).Range
        myRange.Text = sVerdi
        .Bookmarks.Add sBookMarkName, myRange
        End If
        End With

    On Error GoTo 0

    objShell = Nothing
WScript = Nothing

每个书签称为“书签”+ INI 中每一行的值。 比如“bookmarkFIRSTNAME”等。

【问题讨论】:

    标签: vba ms-word ini


    【解决方案1】:

    您可以只使用字典(来自 MS 脚本库)。

    Dim oDict as new scripting.dictionary
    Dim arrVals, x
    
    arrVals = Array("Path","String","Fornavn") 'etc etc
    for x=lbound(arrVals) to ubound(arrVals)
       oDict.Add arrVals(x), ReadIni(File, strRegArea, arrVals(x))
    next x
    

    现在您可以将您的值引用为(例如): oDict("路径")

    不过,您所做的只是将它们从 ini 文件移动到字典:在这两种情况下,您只需按名称引用值。不过,它的代码更少...... 我不确定首先将它们转移到数组的目的?您的代码是仅返回数组的函数的一部分吗?

    提姆

    【讨论】:

    • 不,它可能一开始就写得不好。基本上,我所做的是将注册表中的数据加载到模板中的预定义书签中。 ini 文件告诉代码注册表中每个键的名称。然后,它将从注册表收集的数据加载到一个数组中,并将每一个都输入到与相同名称匹配的相应书签中。如果您有任何建议,请随时提出:)
    • 如果你不需要存储ini/registry查找结果,只需要在书签中插入then,只需采取循环的方式,从ini中读取>从注册表中读取>插入到书签中循环的每次迭代。
    • 我真的不需要存储它们。我只需要从 INI 文件中查找值,浏览书签并查看书签是否称为“书签+INI 值”,然后使用与 INI 键中的值相同的值并从注册表项,然后将其插入书签。
    • 是否可以读取 ini 文件的部分并创建数组而无需指定密钥?我希望代码转到 ini 文件中的指定部分,然后读取所有字符串并将它们放入一个数组中。然后只需通过该数组并查找书签并通过注册表。但是这样做我需要它来阅读整个部分并将其放入一个数组中。所有这些都无需我在 ini 部分中指定每个键。我相信你明白我的意思,除非我很不擅长解释:p
    猜你喜欢
    • 2011-07-24
    • 2014-02-20
    • 2011-10-28
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2014-03-16
    • 2012-06-29
    相关资源
    最近更新 更多