VBA code import data uit ander workbook incl hyperlink

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • BBB-Nick
  • Registratie: Mei 2021
  • Laatst online: 05-10 16:27
Hi,

In excel heb ik een database met onder andere hyperlinks naar bestanden op de computer.

Nu wil ik in een ander workbook deze database importeren. Dit gaat goed alleen krijg ik de hyperlinks als platte tekst geïmporteerd.

Weet iemand wat ik aan de code moet veranderen zodat hij ook de hyperlinks meeneemt?

Ik heb ook al geprobeerd om de selectie te selecteren, kopieren en te plakken maar dit werkt ook niet.

Volgens mij gaat het bij regel 34 en 35 hieronder niet goed.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Private Sub import_Click()

    Dim Target_Workbook As Workbook
    Dim Source_Workbook As Workbook
    Dim Source_Path As String
    
    Dim source As FileDialog
    Dim selectedFile As String
        
        
        Set source = Application.FileDialog(msoFileDialogFilePicker)
        
On Error Resume Next

    With source
        .Title = "Selecteer bestand met bonnen en contacten"
        .AllowMultiSelect = False
        .InitialFileName = ThisWorkbook.Path
        .Show
        selectedFile = .SelectedItems(1)
    End With
    
    '''''Assign the Workbook File Name along with its Path
    '''''Change path of the Target File name

    Source_Path = selectedFile
    
    Set Source_Workbook = Workbooks.Open(Source_Path)
    Set Target_Workbook = ThisWorkbook
    
    '''''With Target_Workbook object now, it is possible to pull any data from it
    '''''Read Data from Target File

    Source_Data = Source_Workbook.Worksheets("Bonnen").Range("A2:G999")
    Target_Workbook.Worksheets("Bonnen").Range("A2:G999") = Source_Data
    
    
    '''''Close Target Workbook

    Target_Workbook.Save
    Source_Workbook.Close False
    
    '''''Process Completed

    MsgBox "Bonnen en contacten zijn geimporteerd"
    
End Sub

Beste antwoord (via BBB-Nick op 06-11-2021 13:26)


  • dixet
  • Registratie: Februari 2010
  • Laatst online: 04-10 11:14
VBA kent de onhebbelijke eigenschap van default properties. Wanneer je een objectvariabele gebruikt zonder een eigenschap te benoemen zal deze default property gebruikt wordt. De default property van het Range object is de Value property.
Wat je dus doet met het commando
code:
1
2
Source_Data = Source_Workbook.Worksheets("Bonnen").Range("A2:G999")
Target_Workbook.Worksheets("Bonnen").Range("A2:G999") = Source_Data

is de waarde uit de Value property kopiëren. En dat is het gedrag dat je beschrijft: je krijgt alleen de tekst te zien.
Ïmpliciet maakt VBA er dit van:
code:
1
2
Source_Data = Source_Workbook.Worksheets("Bonnen").Range("A2:G999").Value
Target_Workbook.Worksheets("Bonnen").Range("A2:G999") = Source_Data.Value


Wanneer je het hele object met álle eigenschappen wilt kopiëren (dus ook de onderliggende hyperlink) zal je dat expliciet aan VBA moeten vertellen met het woordje SET.

Dus:
code:
1
2
Set Source_Data = Source_Workbook.Worksheets("Bonnen").Range("A2:G999")
Set Target_Workbook.Worksheets("Bonnen").Range("A2:G999") = Source_Data



Jean luc Picard schreef op woensdag 3 november 2021 @ 22:29:
Moet je Source_Data niet eerst declareren as worksheet?
In VBA is standaard het declareren van variabelen niet verplicht. Dus dit werkt gewoon. Een goede eigenschap is om dit wel verplicht te maken (via instellingen, of bovenin je module "Option Explicit" te zetten).
Door dit uit te laten staan loop het het risico dat je met een tikfout een nieuwe variabele declareert met al het onvoorspelbare gedrag omdat je zelf niet door het dat je nu 2 variabelen hebt

[ Voor 20% gewijzigd door dixet op 04-11-2021 13:09 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Jean luc Picard
  • Registratie: Augustus 2016
  • Laatst online: 14-09 08:49
Moet je Source_Data niet eerst declareren as worksheet?

Acties:
  • Beste antwoord
  • +3 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 04-10 11:14
VBA kent de onhebbelijke eigenschap van default properties. Wanneer je een objectvariabele gebruikt zonder een eigenschap te benoemen zal deze default property gebruikt wordt. De default property van het Range object is de Value property.
Wat je dus doet met het commando
code:
1
2
Source_Data = Source_Workbook.Worksheets("Bonnen").Range("A2:G999")
Target_Workbook.Worksheets("Bonnen").Range("A2:G999") = Source_Data

is de waarde uit de Value property kopiëren. En dat is het gedrag dat je beschrijft: je krijgt alleen de tekst te zien.
Ïmpliciet maakt VBA er dit van:
code:
1
2
Source_Data = Source_Workbook.Worksheets("Bonnen").Range("A2:G999").Value
Target_Workbook.Worksheets("Bonnen").Range("A2:G999") = Source_Data.Value


Wanneer je het hele object met álle eigenschappen wilt kopiëren (dus ook de onderliggende hyperlink) zal je dat expliciet aan VBA moeten vertellen met het woordje SET.

Dus:
code:
1
2
Set Source_Data = Source_Workbook.Worksheets("Bonnen").Range("A2:G999")
Set Target_Workbook.Worksheets("Bonnen").Range("A2:G999") = Source_Data



Jean luc Picard schreef op woensdag 3 november 2021 @ 22:29:
Moet je Source_Data niet eerst declareren as worksheet?
In VBA is standaard het declareren van variabelen niet verplicht. Dus dit werkt gewoon. Een goede eigenschap is om dit wel verplicht te maken (via instellingen, of bovenin je module "Option Explicit" te zetten).
Door dit uit te laten staan loop het het risico dat je met een tikfout een nieuwe variabele declareert met al het onvoorspelbare gedrag omdat je zelf niet door het dat je nu 2 variabelen hebt

[ Voor 20% gewijzigd door dixet op 04-11-2021 13:09 ]


Acties:
  • +1 Henk 'm!

  • BBB-Nick
  • Registratie: Mei 2021
  • Laatst online: 05-10 16:27
Super, met set er voor is het gelukt.

Bedankt!!