Wert aus einer anderen nicht geöffneten Arbeitsmappe "importieren"

  • Excel

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von LudwigM.

    Wert aus einer anderen nicht geöffneten Arbeitsmappe "importieren"

    Hallo,
    ich möchte in eine geöffnete Arbeitsmappe(1) einen Wert aus einer (noch) nicht geöffneten Arbeitsmappe(2) eintragen.
    Die entsprechende Zelle soll in der B Spalte der Arbeitsmappe2 gesucht werden
    --> String in Spalte B suchen, wenn gefunden Wert aus der Zelle rechts daneben in die Arbeitsmappe1 kopieren.

    Vielen Dank im Voraus
    Ludwig

    SVerweis per VBA

    Vielen Dank petaod!
    Wie kann ich das per VBA ausführen?
    SVerweis innerhalb einer Arbeitsmappe per VBA geht:

    Visual Basic-Quellcode

    1. Application.WorksheetFunction.VLookup([A1], Sheets("Tabelle1").[A3:B10], 2, False)

    Wie kann ich das jetzt auch in einer anderen Arbeitsmappe machen?


    Ludwig
    Ich habe das Gefühl, du machst das etwas kompliziert.
    Warum öffnest du das andere Worksheet nicht und setzt einen Find ab?
    Excel muss das beim Refresh des SVerweis auch tun.

    Ich bin von deiner ursprünglichen Anforderung ausgegangen.

    LudwigM schrieb:

    String in Spalte B suchen, wenn gefunden Wert aus der Zelle rechts daneben in die Arbeitsmappe1 kopieren.
    Dafür würde ich eine SVERWEIS-Formel in die Zielzelle eintragen (manuell oder per VBA).
    Wenn du den Wert im Programm benötigst, kannst du den Wert dieser Zelle verwenden.

    Wenn du den Wert im Worksheet nicht haben willst, dann lass den SVERWEIS weg.
    Insbesondere wenn du permanent solche Lookups benötigst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Öffnen und Find-Methode anwenden.

    Wie macht man das am besten? So?

    Visual Basic-Quellcode

    1. Dim workbook As String
    2. Dim foundedcell As Range
    3. Dim ergebnis As Integer
    4. workbook = "C:\...\Test.xlsm"
    5. Workbooks.Open (workbook)
    6. Set foundedcell = Workbooks("Test.xlsm").Sheets(1).Range("B3:B10").Find("HalloWelt", , xlValues)
    7. ergebnis = Range(foundedcell.Address).Offset(0, 3).Value
    8. MsgBox ergebnis 'bzw. weiter verwenden

    Wie kann man die Arbeitsmappe dann wieder schließen ohne das der Benutzer davon etwas mitbekommt?

    Visual Basic-Quellcode

    1. Set wb = Workbooks.Open ("C:\...\Test.xlsm", UpdateLinks:=False, ReadOnly:=True)
    2. Set c = wb.Sheets(1).Range("B3:B10").Find("HalloWelt", LookIn:=xlValues, LookAt:=xlWhole)
    3. ergebnis = IIf(c is Nothing, 0, Val(c.Offset(0, 3).Value))
    4. wb.Close False
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja so geht es, wb muss dann doch als Workbook deklariert sein.
    Gibt es noch die Möglichkeit die Ereignisse der Arbeitsmappe2, die durch Code geöffnet wird zu unterbinden?
    Denn diese führen Code und Aktualsierungen der Arbeitsmappe2 durch die den Vorgang nur verlangsamen und in diesem Fall nicht nötig sind, ich will ja nur den einen Wert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LudwigM“ ()

    Visual Basic-Quellcode

    1. Application.EnableEvents = False
    2. Set wb = Workbooks.Open ("C:\...\Test.xlsm", UpdateLinks:=False, ReadOnly:=True)
    3. Set c = wb.Sheets(1).Range("B3:B10").Find("HalloWelt", LookIn:=xlValues, LookAt:=xlWhole)
    4. ergebnis = IIf(c is Nothing, 0, Val(c.Offset(0, 3).Value))
    5. wb.Close False
    6. Application.EnableEvents = True
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Du brauchst Val nicht zwingend, aber wenn dir dabei die Nachkommastellen abhanden kommen, liegt es nicht daran.
    Da gibt es zwei Möglichkeiten:
    - Du hast 'ergebnis' als Ganzzahltyp (z.B. Integer) definiert
    - Die Zellen beinhalten Text mit einem falschen Dezimalseparator (Punkt statt Komma z.B.)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja es liegt an dem Dezimalseperator.
    Val("123,4") liefert 123
    Val("123.4")liefert 123,4

    Ich habe in allen Zelle das Komma als Dezimalseperator.
    Ich lasse die Funktion Val jetzt einfach weg, oder gibt das für mich irgendwelche Nachteile?

    LudwigM schrieb:

    Ich lasse die Funktion Val jetzt einfach weg


    Visual Basic-Quellcode

    1. ergebnis = IIf(c Is Nothing, 0, Val(Replace$(c.Offset(0, 3).Value, ",", ".", , , vbTextCompare)))


    Aber mit den 1000er Punkten aufpassen. Evtl. diese vorher noch entfernen:

    Visual Basic-Quellcode

    1. Dim sTemp As String
    2. sTemp = c.Offset(0, 3).Value
    3. If InStr(1, sTemp, ".", vbTextCompare) > 0 And InStr(1, sTemp, ",", vbTextCompare) > 0 Then
    4. sTemp = Replace$(sTemp, ".", "", 1, , vbTextCompare)
    5. sTemp = Replace$(sTemp, ",", ".", , , vbTextCompare)
    6. ElseIf InStr(1, sTemp, ",", vbTextCompare) > 0 Then
    7. sTemp = Replace$(sTemp, ",", ".", , , vbTextCompare)
    8. End If
    9. ergebnis = IIf(c Is Nothing, 0, Val(sTemp))



    Man kann es auch zwischenspeichern. Keine Ahnung, ob es notwendig ist.

    Visual Basic-Quellcode

    1. Private Type tKommas
    2. DezimalSeparator As String
    3. TausenSeparator As String
    4. SystemSeparator As Boolean
    5. End Type
    6. Private Sub los()
    7. Dim optAlt As tKommas
    8. Dim sTemp As String
    9. Dim ergebnis As Double
    10. With optAlt
    11. .DezimalSeparator = Application.Decimalseparator
    12. .TausenSeparator = Application.ThousandsSeparator
    13. .SystemSeparator = Application.UseSystemSeparators
    14. End With
    15. Application.UseSystemSeparators = False
    16. Application.Decimalseparator = ","
    17. Application.ThousandsSeparator = "."
    18. ...
    19. sTemp = Replace$(sTemp, ".", "", 1, , vbTextCompare)
    20. sTemp = Replace$(sTemp, ",", ".", , , vbTextCompare)
    21. ...
    22. With optAlt
    23. Application.UseSystemSeparators = .SystemSeparator
    24. Application.Decimalseparator = .DezimalSeparator
    25. Application.ThousandsSeparator = .TausenSeparator
    26. End With
    27. End Sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „peterfido“ ()

    Ich weiß leider immer noch nicht wo für die Val-Funktion gut sein soll.
    Ist es nur eine Vorbeugung, falls sich in den Zellen keine Zahlen befinden? Es sind immer Zahlen vorhanden, ansonsten ist die Zelle leer!

    Weiterhin habe ich erst jetzt bemerkt, dass es einen Fehler in der Zeile

    Visual Basic-Quellcode

    1. ergebnis = IIf(c Is Nothing, 0, Val(c.Offset(0, 3).Value))

    gibt, wenn der gesuchte String im entsprechenden Bereich nicht vorhanden ist (Objektvariable oder With-Blokvariable nicht festgelegt).
    Statt val nutze ich öfter cType

    Also

    Visual Basic-Quellcode

    1. Dim s As String
    2. Dim d As Double
    3. Dim i As Integer
    4. s = "2,5"
    5. d = CDbl(s)
    6. i = CInt(s)


    oder sicherer:

    Visual Basic-Quellcode

    1. s = "2,5"
    2. If IsNumeric(s) Then
    3. d = CDbl(s)
    4. i = CInt(s)
    5. End If


    Val() ist dafür da, um einen Text in eine Zahl zu wandeln. Mit dieser lässt sich dann z.B. Rechnen.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „peterfido“ ()