Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1956to1960
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Bereich einer geschlossenen Excel-Tabelle in Array

Bereich einer geschlossenen Excel-Tabelle in Array
04.12.2023 14:28:33
Stefan Blaschke
Hallo zusammen,

ich bin auf der Suche nach einer Hilfestellung.

Auf dem Laufwerk befindet sich eine ExcelTabelle - diese ist nicht geöffnet.
Diese Tabelle würde ich gerne im Hintergrund auslesen, z. B. Tabelle1, Bereich A1:Z20.
Diesen gesamten Bereich würde ich gerne in ein Array schreiben.


ARR_Import = Sheets("Tabelle7").Range("A1:DZ1000").Value


Was ich bisher habe ich dieser Code


Dim ARR_Import(1000, 1000) As String

Private Sub CommandButton3_Click()
Bereich_auslesen
Test3
End Sub

Private Sub Test3()

'Declaration
Dim Arr_Data(1000, 130)
Dim ix As Integer 'Columns
Dim iy As Integer 'Rows

'ARR_Import = Sheets("Tabelle7").Range("A1:DZ1000").Value

For ix = 1 To 130 'Spalte A bis DZ = 130 Spalten

For iy = 1 To UBound(ARR_Import)
If ARR_Import(iy, ix) = "Distribution Channel" Then
Arr_Data(iy, 1) = "Distribution Channel"
Arr_Data(iy, 2) = ARR_Import(iy + 1, ix)
End If
Next iy

For iy = 1 To UBound(ARR_Import)
If ARR_Import(iy, ix) = "Unit of Order Quantity" Then
Arr_Data(iy + 1, 1) = "Unit of Order Quantity"
Arr_Data(iy + 1, 2) = ARR_Import(iy + 1, ix)
End If
Next iy

For iy = 1 To UBound(ARR_Import)
If ARR_Import(iy, ix) = "Order" Then
Arr_Data(iy + 2, 1) = "OrderNumber"
Arr_Data(iy + 2, 2) = ARR_Import(iy + 1, ix)
End If
Next iy

For iy = 1 To UBound(ARR_Import)
If ARR_Import(iy, ix) = "ProjectManager" Then
Arr_Data(iy + 3, 1) = "PM"
Arr_Data(iy + 3, 2) = ARR_Import(iy + 1, ix)
End If
Next iy

Next ix

MsgBox _
Arr_Data(1, 1) & ": " & Arr_Data(1, 2) & vbNewLine & _
Arr_Data(2, 1) & ": " & Arr_Data(2, 2) & vbNewLine & _
Arr_Data(3, 1) & ": " & Arr_Data(3, 2) & vbNewLine & _
Arr_Data(4, 1) & ": " & Arr_Data(4, 2)
End Sub

Sub Bereich_auslesen()
'** Dimensionierung der Variablen
Dim pfad As String, datei As String, blatt As String, bereich As Range, zelle As Object

'** Angaben zur auszulesenden Zelle
pfad = "C:\Users\15_SAPExport"
datei = "Export_Sample.xlsx"
blatt = "Format"
Set bereich = Range("A1:DM30")

'** Bereich auslesen
For Each zelle In bereich

'** Zellen umwandeln
zelle = zelle.Address(False, False)

'** Eintragen in Bereich
ARR_Import(zelle.Row, zelle.Column) = GetValue(pfad, datei, blatt, zelle)
Next zelle


MsgBox ARR_Import(3, 1)

End Sub

Private Function GetValue(pfad, datei, blatt, zelle)
Dim arg As String

If Right(pfad, 1) > "\" Then pfad = pfad & "\"
If Dir(pfad & datei) = "" Then
GetValue = "datei Not Found"
Exit Function
End If

arg = "'" & pfad & "[" & datei & "]" & blatt & "'!" & Range(zelle).Range("A1").Address(, , xlR1C1)

GetValue = ExecuteExcel4Macro(arg)

End Function


Jedoch ist das alles Zelle für Zelle und somit recht langsam.
Hat jemand eine andere Idee?!

Grüße
Stefan

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bereich einer geschlossenen Excel-Tabelle in Array
04.12.2023 14:55:08
Piet
Hallo

vielleicht habe ich da eine "dumme Idee", man muss sie nur mal testen.
Schreibe dir die 1. Formel in eine Tabelle, in Zelle A1, aber als relative Formel (ohne $Zeichen!)
Dann kopierst du sie komplett von A1 bis Z20. Danach kannst du sie in Werte umwandeln.
Das dürfte entschieden schneller sein als eine For Next Schleife!

mfg Piet
AW: Bereich einer geschlossenen Excel-Tabelle in Array
04.12.2023 16:38:13
Stefan Blaschke
Hallo nochmals,

habe es nun eben nochmals hiermit versucht.



Option Explicit

Dim ARR_Import(1000, 1000) As String

Private Sub CommandButton1_Click()
HoleDaten
End Sub

Public Function GetDataClosedWB(SourcePath As String, SourceFile As String, sourceSheet As String, SourceRange As String, TargetRange As Range) As Boolean
Dim strQuelle As String
Dim Zeilen As Long
Dim Spalten As Byte
On Error GoTo InvalidInput
strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range(SourceRange).Cells(1, 1).Address(0, 0)
Zeilen = Range(SourceRange).Rows.Count
Spalten = Range(SourceRange).Columns.Count
With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
.Value = .Value
End With

GetDataClosedWB = True
Exit Function
InvalidInput:
MsgBox "Die Quelldatei oder der Quellbereich ist ungültig!", vbExclamation, "Get data from closed Workbook"
GetDataClosedWB = False
End Function

Public Sub HoleDaten()
Dim Pfad As String
Dim Dateiname As String
Dim Blatt As String
Dim Bereich As String
Dim Ziel As Range
Pfad = "C:\Users\15_SAPExport\"
Dateiname = "Export_Sample.xlsx"
Blatt = "Format"
Bereich = "A1:C20"

Set Ziel = ActiveSheet.Range("A1")
'MsgBox Ziel

If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub


Daten werden ausgelesen (wesentlich schneller und ich glaube auf einen Rutsch).
Jedoch weiß ich hier nicht wie ich diese in ein Array bekomme.

Grüße
Stefan
Anzeige
AW: Bereich einer geschlossenen Excel-Tabelle in Array
05.12.2023 13:51:09
daniel
Am einfachsten dürfte sein, die Mappe schreibgeschützt zu öffnen, das Array einzulesen und dann die Mappe wieder zu schließen:

Application.ScreenUpdating = false

With Workbooks.Open("pfad\dateiname", ReadOnly:=True)
ARR_Import = .Sheets("Tabelle7").Range("A1:DZ1000").Value
.Close False
End with
Application.ScreenUpdating = true


wie gesagt, Bildschirmaktualisierung ausschalten, dann fällts nicht auf dass die Mappe geöffnet wird und die Mappe schreibgeschützt öffnen, dann gibt es keine Probleme, wenn sie zeitgleich von jemand anderem bearbeitet wird.
Sollte die Mappe noch externe Zellbezüge haben, dann kann man hierzu auch die Verfahrensweise im Workbook.Open angeben, so dass keine Rückfragen an den Anwender entstehen.
Sollte die Mappe ein Makro im Workbook.Open-Event haben, dann müsste man zusätzlich noch die Events ausschalten (Application.EnableEvents = false), damit dieses nicht ausgeführt wird.

Gruß Daniel
Anzeige
AW: Bereich einer geschlossenen Excel-Tabelle in Array
04.12.2023 18:18:36
Piet
Hallo

setze hinter den Befehl Set Ziel = ~~ noch diesen Befehl:
Arry = ActiveSheet.Range("A1:C20"") 'Arry = Array

mfg Piet
AW: Bereich einer geschlossenen Excel-Tabelle in Array
05.12.2023 07:36:38
Stefan Blaschke
Guten Morgen zusammen,

anbei mein aktueller Stand.


Option Explicit

Dim ARR_Import() As String
Dim ARR_Data(1000, 1000) As String

Private Sub CommandButton1_Click()
HoleDaten
End Sub

Public Function GetDataClosedWB(SourcePath As String, SourceFile As String, sourceSheet As String, SourceRange As String, TargetRange As Range) As Boolean
Dim strQuelle As String
Dim Zeilen As Long
Dim Spalten As Byte
Dim ix As Integer 'Columns
Dim iy As Integer 'Rows

Dim ixx As Integer 'Columns
Dim iyy As Integer 'Rows

On Error GoTo InvalidInput

strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range(SourceRange).Cells(1, 1).Address(0, 0)
Zeilen = Range(SourceRange).Rows.Count
Spalten = Range(SourceRange).Columns.Count

With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
'.Value = .Value
End With

ReDim ARR_Import(Zeilen, Spalten)

For ix = 1 To Spalten
For iy = 1 To Zeilen
ARR_Import(iy, ix) = TargetRange.Cells(iy, ix) '.Value
Next iy
Next ix

For ixx = 1 To Spalten
If ARR_Import(1, ixx) = "Sales order" Then
ARR_Data(3, 1) = "Sales order number"
ARR_Data(3, 2) = ARR_Import(2, ixx)
End If

If ARR_Import(1, ixx) = "Name of Ship to Party" Then
ARR_Data(11, 1) = "Customer"
ARR_Data(11, 2) = ARR_Import(2, ixx)
End If

If ARR_Import(1, ixx) = "Name of Sales district" Then
ARR_Data(15, 1) = "Region"
ARR_Data(15, 2) = ARR_Import(2, ixx)
End If

If ARR_Import(1, ixx) = "Ship to Party" Then
ARR_Data(9, 1) = "Kundennummer"
ARR_Data(9, 2) = ARR_Import(2, ixx)
End If

Next ixx

MsgBox _
ARR_Data(3, 1) & ": " & ARR_Data(3, 2) & vbNewLine & _
ARR_Data(11, 1) & ": " & ARR_Data(11, 2) & vbNewLine & _
ARR_Data(15, 1) & ": " & ARR_Data(15, 2) & vbNewLine & _
ARR_Data(9, 1) & ": " & ARR_Data(9, 2)

GetDataClosedWB = True

Exit Function
InvalidInput:
MsgBox "Die Quelldatei oder der Quellbereich ist ungültig!", vbExclamation, "Get data from closed Workbook"
GetDataClosedWB = False

End Function

Public Sub HoleDaten()
Dim Pfad As String
Dim Dateiname As String
Dim Blatt As String
Dim Bereich As String
Dim Ziel As Range

Pfad = "C:\Users\05_Tools\15_SAPExport\"
Dateiname = "Export_Sample.xlsx"
Blatt = "Format"
Bereich = "A1:DZ1000"

With ThisWorkbook
.Sheets.Add after:=Sheets(Worksheets.Count)
.ActiveSheet.Name = "Import"
.Activate
End With

Set Ziel = ActiveSheet.Range("A1")

If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If

Application.DisplayAlerts = False
Worksheets("Import").Delete
Application.DisplayAlerts = True

End Sub


So richtig gut gefällt mir das noch nicht ...

Es wird aktuell in die Tabelle geschrieben, um die Werte in mein Array ("Array_Import") zu bekommen.
Das ist etwas "unschön" wie ich finde.

Aus diesem Grund erzeuge ich ein neues Tabellenblatt Names "Import" und füge hier die Daten ein.
Aber gut finde ich das persönlich auch nicht.

=> Wie bekomme ich die Daten ohne Einträge in mein Array?!

Grüße
Stefan
Anzeige
AW: Bereich einer geschlossenen Excel-Tabelle in Array
05.12.2023 13:41:39
Piet
hALLO

auf Youtube gibt es einige -Videos zu deinem Thema, z.B. Daten aus anderer Datei importieren ohne diese zu öffnen
https://www.youtube.com/watch?v=5rBOPvFwFuo - Die Erklärungen sind sehr umfangreich, bitte selbst anschauen.

MFG pIET

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige