tobias1900
Goto Top

Den Wert eines Speichers mit einer Spalte einer anderen Excelmappe vergleichen

Hallo!

Folgendes Problem:

Betätige ich in meinem Visualisierungsprogramm (iFix), welches mit VBA programmiert ist, einen Button, wird eine TCP/IP-Socket verbindung aufgebaut und ein Wert in ein dataBuf (String) geschrieben. Das Funktioniert.

Jetzt soll der Wert im dataBuf mit der Spalte A einer Excelmappe verglichen werden. Diese liegt auf dem selben Rechner wie das Visualisierungsprogramm.

Die Excelmappe lässt sich öffnen:

Dim strDateiname As String


strDateiname = "C:\Dokumente und Einstellungen\Schule\Desktop\Anpreßwalzenauswertung_Kartei.xls"


Dim Excel As Object


Set Excel = CreateObject("Excel.Application")
If Excel Is Nothing Then
MsgBox "Konnte keine Verbindung zu Excel herstellen!", 16, "Problem"
Exit Sub
End If

With Excel
.Visible = True
.Workbooks.Open strDateiname
End With
Exit Sub


Exit_Konten_Click:
Exit Sub

Err_Konten_Click:
MsgBox Err.Description
Resume Exit_Konten_Click

Wie vergleiche ich nun den Wert im dataBuf mit der Spalte A der Excelmappe?

Danke und Grüße

Content-Key: 239177

Url: https://administrator.de/contentid/239177

Printed on: April 25, 2024 at 05:04 o'clock

Mitglied: 116301
116301 May 26, 2014 updated at 13:59:36 (UTC)
Goto Top
Hallo Tobias1900!

Das kommt darauf an:
- Befindet sich die Zelle im ersten Tabellenblatt oder muss eine bestimmte Tabelle angesprochen werden?
- Soll der gesamte Inhalt mit/ohne Klein/Groß-Unterscheidung oder nur ein Teil des Inhalts verglichen werden?

Ansonsten frage ich mich, wieso Du ein Excel-Object mit 'Visible=True' erzeugst, wenn Du eh schon Excel ausführst?

Grüße Dieter
Member: colinardo
colinardo May 26, 2014 updated at 18:00:57 (UTC)
Goto Top
Hallo Tobias1900, Willkommen auf Administrator.de!
Da du uns etwas wenig Informationen lieferst um welchen Datentyp es sich mit deiner Variablen dataBuf() handelt können wir nur spekulieren, vermutlich ein Array aus Strings. Wenn es nur darum geht um zu vergleichen ob der Inhalt des Arrays identisch mit der gleichen Anzahl an Zellen in Spalte A des Worksheets ist(gleiche Reihenfolge), kannst du es ungetestet etwa so machen (ich gehe mal davon aus das du deinen Code aus einer anderen Anwendung ausführst als Excel, da du ja ein Excel-Objekt erzeugst):
Sub DeineSub()
    Dim strDateiname As String, Excel As Object, wb As Object, ws As Object, arr As Variant, identical As Boolean
    strDateiname = "C:\Dokumente und Einstellungen\Schule\Desktop\Anpreßwalzenauswertung_Kartei.xls"  
    Set Excel = CreateObject("Excel.Application")  
    
    ' Der Variablen noch dein 'dataBuf()' Array zuweisen  
    arr = dataBuf
    
    identical = True
    'eventuelle Dialoge unterdrücken  
    Excel.DisplayAlerts = False
    
    If Excel Is Nothing Then
        MsgBox "Konnte keine Verbindung zu Excel herstellen!", 16, "Problem"  
        Exit Sub
    End If
    
    With Excel
        'Sichtbar ausführen  
        .Visible = True
        'Workbook öffnen  
        Set wb = .Workbooks.Open(strDateiname)
        'Tabelle festlegen  
        Set ws = wb.Worksheets(1)
        'Vergleiche Array mit Zellen in Spalte A  
        If IsArray(arr) Then
            For i = 0 To UBound(arr)
                'Wenn Wert des Arrayelementes nicht mit dem Inhalt der Zelle übereinstimmt, gebe 'False' zurück  
                If ws.Cells(i + 1, 1).Value <> arr(i) Then
                    identical = False
                    Exit For
                End If
            Next
            If identical Then
                'Array ist identisch mit Inhalt  
                MsgBox "Inhalt ist identisch mit Spalte A", vbInformation  
            Else
                'Array ist unterschiedlich  
                MsgBox "Inhalt ist unterschiedlich zu Spalte A", vbExclamation  
            End If
        Else    'Inputvariable ist kein Array  
            MsgBox "Variable ist kein Array", vbExclamation  
        End If
    End With
    
    Excel.DisplayAlerts = True
    Excel.Quit
    Set Excel = Nothing
    Set wb = Nothing
    Set ws = Nothing
End Sub
Im jetztigen Zustand wird zwischen Groß und Kleinschreibung unterschieden. Wenn das nicht gewollt ist Zeile 29 so abzuändern:
If LCase(ws.Cells(i + 1, 1).Value) <> LCase(arr(i)) Then 

Viel Erfolg
Grüße Uwe
Member: Tobias1900
Tobias1900 May 26, 2014 at 18:03:25 (UTC)
Goto Top
Hallo!

Danke für eure Hilfen!

Bei dem dataBuf handelt es sich um einen Speicher bzw. Wert des Typs String. Es ist richtig das ich den Code aus einer anderen Anwendung heraus ausführe. face-smile

Im dataBuf können die Werte "WA0001-WA0100" (fortlaufende Nummern) stehen.

Diese Werte stehen so auch in der Spalte A Zeile 1 bis Spalte Zeile 100 der Excelliste.

Nun soll wie schon richtig vermutet der Wert im dataBuf mit der Spalte verglichen werden und der Inhalt der Zeile ausgelesen werden.

Alles sehr komplex wie ich finde. Vor allem wenn die VBA-Programmierung neuland ist...

Güße und vielen Dank!
Mitglied: 116301
Solution 116301 May 27, 2014, updated at May 28, 2014 at 10:46:16 (UTC)
Goto Top
Hallo Tobias!

Dann in etwa so:
Private Const ExcelFile = "C:\Dokumente und Einstellungen\Schule\Desktop\Anpreßwalzenauswertung_Kartei.xls"  

Private Const xlWhole = 1           'Vergleiche ganzen Inhalt  
Private Const xlPart = 2            'Vergleiche Teil-Inhalt  
Private Const xlValues = -4163      'Suche in Zellwerten  

Private Const vbCritical = 16
Private Const vbExclamation = 48
Private Const vbInformation = 64

Sub Test()
    Call ExcelSearch("Testabc")  
End Sub

Sub ExcelSearch(ByVal strSearch As String)
    Dim objExcel As Object, objWkb As Object, objWks As Object, objFound As Object
    
    On Error Resume Next
    
    Set objExcel = CreateObject("Excel.Application")  
    Set objWkb = objExcel.Workbooks.Open(ExcelFile)
    Set objWks = objWkb.Sheets(1)
    
    If objExcel Is Nothing Then
        MsgBox "Konnte keine Verbindung zu Excel herstellen!", vbCritical, "Problem"  
    ElseIf objWkb Is Nothing Then
        MsgBox "Excel-Datei konnte nicht geöffnet werden!", vbCritical, "Problem"  
    Else
        'Args: Suchstring, , in Zellwerten suchen, Vergleich teil (xlPart) / ganzer(xlWhole) Inhalt  
        Set objFound = objWks.Range("A:A").Find(strSearch, , xlValues, xlWhole)  
        
        If objFound Is Nothing Then
            MsgBox strSearch & ": Nicht gefunden!", vbInformation, "Hinweis"  
        Else
            MsgBox strSearch & ": In Zeile " & objFound.Row & " gefunden!", vbInformation, "Hinweis"  
        End If
        objWkb.Close False
    End If
        
    If IsObject(objExcel) Then objExcel.Quit
    
    On Error GoTo 0
End Sub

Grüße Dieter
Member: Tobias1900
Tobias1900 May 28, 2014 at 06:52:21 (UTC)
Goto Top
Hallo Dieter!

Vielen Dank für deine Hilfe! Besonders das die Excelmappe nich sichtbar aktiv wird gefällt mir sehr sher gut! Super

Hat funktioniert! Super Forum super Hilfe!

Bei weiteren Fragen werde ich wohl wieder auf dieses Forum zurückkommen.

Grüße Tobias
Mitglied: 116301
116301 May 28, 2014 at 07:12:30 (UTC)
Goto Top
Hallo Tobias!

Hat funktioniert! Super Forum super Hilfe!
Freut mich zu hörenface-smile

Dann bitte den Thread noch als gelöst markieren, Dankeface-wink

Grüße Dieter