# Exceldatei über VB auslesen und neuen Wert/String übernehmen



## FunthomasX (20. April 2005)

Hallo, 

hatte vor einigen tagen schon einmal eine Anfrage wegen dem Auslesen eienr Textdatei für mein Programm. Hat alles wunderbar geklappt und das Programm läuft. Nun gibt es eine Erweiterung für das Programm: Es soll den eingelesenen Text (Englisch) in einen deutschen Text ersetzen. Ich habe hierfür eine Exceldatei bekommen in der in einer Spalte die englischen Wörter und in der anderen Spalte die deutschen Wörter stehen. 
Was ich jetzt brauche ich know how über Zugriffe in Excel, wo gibt es eine Seite oder Anleitung wie ich auf Zeilen bzw. Spalten zugreifen kann und die Werte übergeben kann? 
Die Sub oder Function sollte also z.B. den String "Mouse" nehmen, das Excel Dokument öffnen und durchsuchen, die Zeile in der engl. Spalte finden wo "Mouse" steht und dann einfach eine Spalte nach rechts gehen (in die Deutsche) und das neue Wort "Maus" übernimmt und für das alte ersetzt.

In meinem Buch steht über Excel Zugriffe leider nix, nur was über SQL Befehle   

THX Funthomas


----------



## Orakel (20. April 2005)

Hi Fun,

naja warum immer gleich zur Keule greifen. Wenn man sich Excel mal genauer betrachtet, wird man feststellen, dass man nicht immer gleich zu VBA greifen muss, um solche Probleme zu lösen. Was hier benötigt wird sind die Matrixfunktionen und im speziellen die Funktion SVERWEIS.

Damit wird ein gesuchter Wert in einer Matrix lokalisiert,  und ein Zielwert aus einer beliebigen Spalte zurückgegeben.

Genaueres findest Du unter der entsprechenden Hilfe

Gruß
Das Orakel


----------



## FunthomasX (21. April 2005)

Hi, 
das mit SVERWEIS ist ganz nett, aber das Problem ist, das es immer nur in der ersten Spalte meines Dokumentes sucht. Bei mir kann es durchaus vorkommen, dass das Suchkriterium nicht in der ersten Spalte, sondern in der zweiten Spalte steht. Für diesen Fall würde mir immer ein Fehler zurückgegeben werden (#NAME). Gibt es eine Suchfunktion in der man die in zu suchender Spalte angeben kann?
Ach ja, wie würde ich eigentlich den SVERWEIS Befehl in VB einbinden? 

THX Funthomas


----------



## Orakel (21. April 2005)

Hi Thomas,

also die Einbindung in VBA kenne ich nur wie folgt:

Cells(nRow, nCol).Formula = "=VLOOKUP(A1,A2:B100,2,0)"
Damit weist Du einer Zelle die entsprechende SVERWEIS-Formel zu.

Eine andere Möglichkeit zu suchen bietet das Application Objekt von Excel-VBA an.

```
If Not IsError(Application.Match(CDbl(dSuchDatum1), Range("A1:C300", 0)) Then
  Rem Tue irgendwas wenn was gefunden wurde
End If
```

Hope it helps
Das Orakel


----------



## FunthomasX (21. April 2005)

hi,

so das mit dem Application Objekt geht in die Hose und erkennen tut er den Befehl auch nciht richtig. Was in einem anderen Beitrag gesehen und mach das jetzt etwa so

```
Dim i As Integer
    Dim Temp, Temp2, Temp3 As String
    Temp = "4-fach"  ' zu suchender Beispiel String, später sind es  Werte aus einem Array
  
    i = 1
    Do
    
        Temp2 = Excel.Range("B" & i)
        If Temp2 = "" Then Exit Do
        
        If Temp2 = Temp Then
        Temp3 = Excel.Range("C" & i)
        MsgBox ("Text: " & Temp3)
        Exit Do
        End If
    i = i + 1
    Loop
    
    Excel.Quit

    Set Excel = Nothing
```

wie läuft das eigentlich mit dem Excel-Objekt? Wenn ich versuche die Sub in einem Modul auszulagen (wegen der Optik), erkennt er das Objekt nicht mehr. 
Wie übergebe ich dem Modul das eingelesene Excel-Objekt
Das Objekt ist aber im Formular unter Option Explicit deklariert.  Das Objekt wird über einem Common Dialog eingelesen..
...
If CommonDialog.Filename <> "" Then
Excel.Workbooks.open CommonDialog1.FileName
...
und unter Form_load steht

Set Excel = CreateObject("Excel.Application")

Excel.Visible = False 

Was heißt das eigentlich im genauen? 
Denke durch das Set Excel = Create... wird dem Objekt die Eigenschaften von Application zugewiesen(z.B. Range, Cells, usw...). Visible= False beduete kein Excel öffnen, sondern alles im Hintergrund machen. richtig?


----------



## FunthomasX (21. April 2005)

ok,
erste Übersetzungen liefen gut  . Leider ist die Sub  lahm  
Gut, ich hab hier zwar nur ein 233 Pentium und die Tabelle hat 3000 Zeilen und 5 Spalten aber naja. 
Wie kann ich den Vorgang beschleunigen? Kann ich  meine Exceldatei irgendwie in den Speicher schreiben, damit das schneller läuft?

so sieht das bisher aus:

```
Sub Translate()
.....
   CmDialog1.Filter = ("Excel-Datei (*.xls)|*.xls;")
    CmDialog1.InitDir = App.Path
    CmDialog1.ShowOpen
    If CmDialog1.FileName <> "" Then
    Excel.Workbooks.open CmDialog1.FileName
    
    End If

         For x = 1 To Zähler - 1
        
            Start = 1
            Index = 1
            Spalte = 0
 
            Do
            
                Index = InStr(Start, ArrayZerlegt1(2, x), Chr(32))       
                If Index = 0 Then Exit Do
                    Erg = Mid(ArrayZerlegt1(2, x), Start, Index - Start)                             
                    Start = Index + 1
                    'Debug.Print Erg
                    
                    Temp = Erg
                    Debug.Print Temp
                    
                    i = 1
                    Do
    
                        Temp2 = Excel.Range("C" & i)  'Englische Spalte
                        If Temp2 = Temp Then
                        Temp3 = Excel.Range("B" & i) 'Deutsche Spalte
                        MsgBox ("Text: " & Temp3)
                        Exit Do
                        End If
                        i = i + 1
                    Loop
                    
                    Temp4 = Temp4 + Temp3 & " "
           
            Loop Until Index = 0
            
            ArrayZerlegt1(2, x) = Temp4
            Temp4 = ""
    Next x
 
    Excel.ActiveWorkbook.Close
    Excel.Quit
    Set Excel = Nothing
End Sub
```

 

THX Funthomas


----------

