Formel in Excel durch dessen berechneten Wert ersetzen

  • VBScript

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von felix_gorgas.

    Formel in Excel durch dessen berechneten Wert ersetzen

    Hallo,

    wir hatten vor geraumer Zeit ein Problem mit unseren Stücklisten welche durch ein VBS in ein Excel-Dokument übertragen werden. Es sollten Summen von verschiedenen Bauteilen in einer
    Baugruppe erstellt werden. Es ist nun geschafft, dass die Summe gebildet wird. Diese Summen möchte ich nun von der Formel (=SUMME ...) in den Zahlenwert übertragen. Wenn ich die
    Zelle anklicke soll also nicht die Formel angezeigt werden, sondern die Zahl.

    Ich habe bereits Google bemüht und folgende VBAs gefunden:

    Quellcode

    1. Sub Bereich_ersetzen()
    2. Dim wS As Worksheet
    3. For Each wS In ActiveWorkbook.Windows(1).SelectedSheets
    4. With wS.Range("A5:G5")
    5. .Value = .Value
    6. End With
    7. Next wS
    8. End Sub


    Quellcode

    1. Sub WerteEinfuegen()
    2. Selection.Copy
    3. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    4. :=False, Transpose:=False
    5. Application.CutCopyMode = False
    6. End Sub


    Leider schaffe ich es nicht diese in ein VBS zu übertragen. Könnte hier mal jemand drüber schaun oder eventuell einen besseren Weg aufzeigen?

    MfG Felix

    felix_gorgas schrieb:

    Leider schaffe ich es nicht diese in ein VBS zu übertragen
    Mit nativem VBS schaffst du das auch nicht.
    Du musst in VBS eine Excel-Instanz eröffnen.
    Mittels dieser kannst du die Excel-Objekte ansprechen.

    Visual Basic-Quellcode

    1. Set XLS = CreateObject("Excel.Application")
    2. Set wb = XLS.Workbooks.Open("c:\x.xlsx")
    3. Set ws=wb.Sheets("Tabelle1")
    4. ws.Range("A5:G5").Formula = ws.Range("A5:G5").Value
    5. wb.Save
    6. wb.Close False
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Hallo,

    ich habe mir die Lösung so zusammengebastelt:

    Visual Basic-Quellcode

    1. Sub Formelnentfernen()
    2. Dim Bereich
    3. Dim J1, J2
    4. Const xlPasteValues = -4163
    5. Const xlPasteSpecialOperationNone = -4142
    6. Set J1 = objExcel.Cells(1,10)
    7. Set J2 = objExcel.Cells(10000,10)
    8. objExcel.Range(J1, J2).Copy
    9. objExcel.Range(J1, J2).PasteSpecial 12
    10. End Sub
    11. Formelnentfernen


    Danke für die Hilfe :)
    Da du ja anscheinend glücklich mit deiner Lösung bist, überlege ich mir die ganze Zeit, ob ich es kommentieren soll.
    Aber ich schaffe es nicht, das so stehen zu lassen. Sorry.

    felix_gorgas schrieb:

    objExcel.Cells(1,10)
    Damit sprichst du ein Range-Objekt von Application an.
    Dahinter verbirgt sich das Worksheet, das nach dem Öffnen zufällig gerade das aktive ist.
    Wenn du mehrere Sheets hast und jemand zufällig so abgespeichert hat, dass ein anderes Sheet aktiv ist, zerstörst du dir dein Spreadsheet.
    Noch schlimmer wird's, wenn du mehrere Workbooks parallel öffnest.

    Deswegen immer die Ranges im Worksheet-Objekt direkt verwenden.
    Wenn du nur ein Workbook geöffnet hast meinetwegen so:

    Visual Basic-Quellcode

    1. Set Col10 = objExcel.ActiveWorkbook.Sheets("Tabelle1").Columns(10)
    2. Col10.Formula = Col10.Value
    Damit sparst du dir das ganze Gewixe mit der Konstantendefinition und dem Pastebuffer.

    objExcel.Range(J1, J2).Copy
    objExcel.Range(J1, J2).PasteSpecial 12
    Es ist extrem gefährlich, mit dem globalen Pastebuffer zu arbeiten, weil der für alle Programme derselbe ist, so dass sich alle automatischen und manuellen Copy&Paste-Operationen gegenseitig beeinflussen.
    Ein absoluter Faux-Pas für ein Programm, das ja nicht weiss, welche Programme parallel laufen oder was der Benutzer gerade tut.

    Du darfst mit deinem Programm natürlich machen, was du willst, aber zur Warnung an alle, die später über diesen Beitrag stolpern, muss einfach vermerkt werden, dass deine Umsetzung nicht als Musterlösung gelten kann.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    danke für die Hinweise aber wir generieren die Stücklisten und arbeiten in dieser Zeit normal im CAD Programm weiter. Hier gibt es keine CopyPaste
    funktionen die mit Windows laufen. Mit STRG+C und STRG+V können keine Teile etc. PP kopiert und eingefügt werde. Es wird auch nur eine Tabelle
    erstellt wodurch der Verweis auf eine weitere nicht benötigt wird. Ebenfalls wird die erstellte XLS nach dem VBS abgespeichert und Excel geschlossen.
    Es sind also nie 2 Excel Dokumente auf :)

    Ich mache gleich mal noch etwas anderes auf (Suchen von unten nach oben).

    DANKE für die Hilfe :)