Uit Docvariabele 2 dimensionale array destileren in Word

Status
Niet open voor verdere reacties.

Plotinus

Gebruiker
Lid geworden
25 mrt 2007
Berichten
649
Uit een Excel-sheet haal ik (eenmalig!) een tabel op van 7 rijen (eerste rij kolomtitels) en 5 kolommen. Deze laat ik achter elkaar in een Doc Variabele in Word. Ik hoef dan niet iedere keer de relatief trage verbinding met Excel te leggen. Ik haal de tabel als volgt op:

Code:
With GetObject("I:\BRIKS\20 - Totaalsloop\Standaardbrieven sloop\Sjablonen\Hulpbestand standaardbrieven bouwunit.xlsb")
     Tabel = .sheets("Beoordelaar").Cells(1).currentregion
     .Close 0
  End With
  
    
  Uitvoerders = ""
 
  For j = 2 To UBound(Tabel)
    Uitvoerders = Uitvoerders & Tabel(j, 1) & "_" & Tabel(j, 2) & "_" & Tabel(j, 3) & "_" & Tabel(j, 4) & "_" & Tabel(j, 5) & "_"
    Next j

  ThisDocument.Variables("Collega") = Uitvoerders
  MsgBox ThisDocument.Variables("Collega")

Uit het resultaat van de laatste regel code blijkt dat het 'intanken' goed gaat.

Maar nu wil ik, iedere keer als ik de betreffende standaardbrief nodig heb, dat Word de tabel als een 2-dimensionale array weer opbouw. Dit met als doel naar specifieke namen te zoeken en dan de naastliggende namen aan Doc_variabelen toe te kunnen wijzen. Helaas lukt me dat niet. Ik krijg o.a steeds de foutmelding dat de typen niet overeen komen (code 13)

Iemand een idee hoe ik de 2 dimensionale array uit de Doc_variabele "Collega" construeer? Moet ik misschien (0.a) iedere regel/rij afsluiten met Chr(0) in plaats van "_"???
 
Als de verbinding met Excel 'traag' is, moet je de systeembeheerder aan zijn jasje trekken.
Dit verloopt hier altijd bliksemsnel.
Jouw 'tabel is helemaal niet 2-dimensioneel: 1 rij met 5 kolommen.
Die kan in 1 regel in een documentvariabele gezet worden.

De zinsnede 'Dit met als doel naar specifieke namen te zoeken en dan de naastliggende namen aan Doc_variabelen toe te kunnen wijzen.' kan ik niet plaatsen voor de gegevens die je nu in de documentvariabele hebt staan.
Aan halve info heeft niemand wat.
 
Jouw 'tabel is helemaal niet 2-dimensioneel: 1 rij met 5 kolommen.
Volgens mij heeft TS het over een tabel met zeven rijen waaronder een rij met koppen. Dat is wel degelijk een 2-dimensionale tabel :). Maar ik ben het met snb eens dat het allemaal niet erg duidelijk is. En wat je precies beoogt dus ook niet. Je kunt beter een voorbeeldje mee sturen.
 
Bijvoorbeeld:

Code:
Sub M_snb()
  With GetObject("G:\OF\adressen.xlsx")
    .Application.DisplayAlerts = False
    .sheets(1).Cells(1).currentregion.Copy
    .Close 0
  End With
    
  With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .GetFromClipboard
     Variables("snb") = .GetText
  End With
    
  MsgBox Variables("snb")
End Sub
 
Excuses voor de onduidelijkheid; ik zal iets meer helderheid proberen te verschaffen:

Ik heb een Word-sjabloon dat een paar honderd keer per jaar door collega's wordt gebruikt. Met behulp van snb (9 juni 10:37) heb ik verschillende lijsten in Doc Variabelen gehangen zodat iedere keer de vertragende verbinding met Excel niet meer nodig is om die info op te halen.

Mijn collega's die deze sjabloon gebruiken en van wie gegevens ook in de brief moeten komen, identificeer ik met een case-opdracht en staan dus in VBA opgelijst:

Code:
Sub Beoordelaar()
    Dim Naam As String, Mail As String, Telefoon As String
        
    Select Case Application.UserName
    Case "Tenburg, Bart"
        Naam = "De heer B. Tenburg"
        Mail = "b.tenburg@bzn.nl"
        Telefoon = "131 206 03 67"
        Unit = "licht"

Dat is met een paar collega's prima te doen. Maar de groep gebruikers is groeiende én de uitdaging is kortere en snellere code. Ik dacht dus ook de lijst van gebruikers in een Doc Variabele te gieten. Zie de Excel-sheet als voorbeeldje. Als er wijzigingen zijn van collega's hoef ik enkel (af en toe) eventjes de nieuwe info naar binnen te trekken / te actualiseren en de rest (code ) niet aan te passen. Dat naar Word overhalen en in een Doc Variabelen gieten doe ik als volgt:

Code:
 With GetObject("I:\***\voorbeeld collega's.xlsb")
     Tabel = .sheets("Beoordelaar").Cells(1).currentregion
     .Close 0
  End With
  
 
  For j = 2 To UBound(Tabel)
    Uitvoerders = Uitvoerders & Tabel(j, 1) & "_" & Tabel(j, 2) & "_" & Tabel(j, 3) & "_" & Tabel(j, 4) & "_" & Tabel(j, 5) & "_"
    Next j

Bedoeling is nu dat bij gebruik door een collega van het Wordsjabloon, uit de data in 'Uitvoerders' een 2 dimensionale array wordt opgebouwd die bevraagd kan worden. De betreffende array noem ik in dit voorbeeld 'Colleg (8,5)'

Code:
Dim Colleg(8, 5) As Variant

    Colleg(1, 1) = "Tenburg, Bart"                  'test of het ideetje onderstaand werkt
    Colleg(1, 2) = "De heer B. Tenburg"             'test of het ideetje onderstaand werkt
    Colleg(1, 3) = "b.tenburg@bzn.nl"               'test of het ideetje onderstaand werkt
    Colleg(1, 4) = "131 206 03 67"                  'test of het ideetje onderstaand werkt
    Colleg(1, 5) = "licht"                          'test of het ideetje onderstaand werkt
    
    For i = 1 To 7
        If Application.UserName = Colleg(i, 1) Then
            With ActiveDocument
                .Variables("varNaambeoordelaar").Value = Colleg(i, 2)
                .Variables("varNaambeoordelaarkl").Value = LCase(Left(Colleg(i, 2), 1)) & Mid(Colleg(i, 2), 2)
                .Variables("varMailbeoordelaar").Value = Colleg(i, 3)
                .Variables("varTelefoonbeoordelaar").Value = Colleg(i, 4)
                .Variables("Discipline").Value = Colleg(i, 5)
           End With
           End If
    Next i


De uitdaging is van de data in 'Uitvoerders' de 2 dimensionale array 'colleg' op de bouwen. Die stap lukt me niet. Als ik dat heb, dan werkt wat ik beoog; zie bovenstaande code met de testdata van de eerste rij van de tabel. Dan maakt het niet meer uit of ik 8 of 80 collega's de brief laat gebruiken. Als ze in de Excel-tabel staan en in Word zijn getrokken, dan blijft de even korte code gewoon werken.

Ik hoop dat het bovenstaande duidelijk is(?) De essentie is dus: hoe bouw ik een 2-dimensionale array op uit een opgeslagen tabel in een Doc Variabele?
 

Bijlagen

  • voorbeeld collega's.xlsx
    10,6 KB · Weergaven: 19
Je kunt ook filteren in de platte docvariabele-gegevens:
Gebruik ook mijn suggestie in #4

Code:
Sub M_snb()
  With GetObject("G:\OF\adressen.xlsx")
    .Application.DisplayAlerts = False
    .sheets(1).Cells(1).currentregion.Copy
    .Close 0
  End With
    
  With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .GetFromClipboard
     Variables("snb") = .GetText
  End With
    
  MsgBox filter(split(Variables("snb"),vblf),"TenBurg")(0)
End Sub
 
Dank voor je reactie! Ik krijg echter een foutmelding: 'Compileerfout Sub of Function is niet gedefinieerd'. En dat heeft betrekking op 'Variables("snb")' Als ik daar een punt (.) voor zet, dan krijg ik fout 438: Deze eigenschap of methode wordt niet ondersteund door dit object.

Is het toch niet eenvoudiger het te gieten in een 2-dim. array? Dat snap ik tenminste en het zal werken.
 
Ik ben eruit:

Als de betreffende data is ingelezen en toegewezen aan de Doc variabele "Collega" dan kan de data als volgt middels een 1-dimensionale array worden geëvalueerd:

Code:
 Dim Beoordelaar() As String
  
    Beoordelaar() = Split(ThisDocument.Variables("Collega"), "_")
    
    With ActiveDocument
        For i = 0 To UBound(Beoordelaar()) Step 4 + 1
            If Application.UserName = Beoordelaar(i) Then
                .Variables("varNaambeoordelaar").Value = Beoordelaar(i + 1)
                .Variables("varNaambeoordelaarkl").Value = LCase(Left(Beoordelaar(i + 1), 1)) & Mid(Beoordelaar(i + 1), 2)
                .Variables("varMailbeoordelaar").Value = Beoordelaar(i + 2)
                .Variables("varTelefoonbeoordelaar").Value = Beoordelaar(i + 3)
                .Variables("Discipline").Value = Beoordelaar(i + 4)
           End If
        Next i
    End With

Hartelijk dank voor de reacties!
 
Als je een punt voor Variables wil zetten zul je toch eerst hoofdstuk 5 van je basisboek VBA beter moeten lezen. VBA schrijven <> 'gokken'.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan