Mit Visual Basic eine Tabellengröße in Excel verändern

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Mit Visual Basic eine Tabellengröße in Excel verändern

    Hallo Wissende,

    ich habe in Excel im ersten Worksheet eine Tabelle "Tabelle1" deren Größe ich mittels VB App ändern möchte. Über ListObjects kann ich diese Tabelle mit Namen oder Nummer 1 ansprechen. Ich versage nur beim neu definieren der Größe. Im Objektkatalog finde ich keinen passenden Befehl. Allerdings ist Name auch nicht aufgeführt und funktioniert ja trotzdem.

    Unter VBA sieht die Zeile wie folgt aus:

    Quellcode

    1. ActiveSheet.ListObjects("Tabelle1").Resize Range("$A$1:$C$5")


    Meine Idee für VB wäre:

    Quellcode

    1. XLWB.Worksheets(1).Listobjects(1).Resize.Range(A1:C5)


    Funktioniert natürlich nicht. Kann wer mir helfen bitte? Danke
    Alex

    Alexprivat schrieb:

    Hallo Wissende,

    ich habe in Excel im ersten Worksheet eine Tabelle "Tabelle1" deren Größe ich mittels VB App ändern möchte. Über ListObjects kann ich diese Tabelle mit Namen oder Nummer 1 ansprechen. Ich versage nur beim neu definieren der Größe.
    Alex


    was soll den passieren nachdem du die neue Range angegeben hast

    ermitteln der aktuell gebrauchten kannst du mit

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim Path As String = "E:\a9.xlsx" 'die Datei
    3. Dim Excel As ApplicationClass = New ApplicationClass
    4. Dim WorkBook As Workbook = Excel.Workbooks.Open(Path)
    5. Dim WorkSheets As Sheets = WorkBook.Sheets
    6. 'Tabelle 1
    7. Dim WorkSheet As Worksheet = CType(WorkSheets(1), Microsoft.Office.Interop.Excel.Worksheet)
    8. Dim ColRange = WorkSheet.UsedRange.Columns.Count 'used Columns
    9. Dim rowRange = WorkSheet.UsedRange.Rows.Count 'used rows
    10. MsgBox(ColRange)
    11. MsgBox(rowRange)
    12. 'WorkBook.Save()
    13. Excel.Application.Quit()
    14. End Sub
    Hallo!

    also

    Quellcode

    1. ​ActiveSheet.ListObjects("Tabelle1").Resize Range("$A$1:$C$5")


    kommt aus dem Makro Rekorder und sollte dann eigentlich auch funktionieren aber darum geht es ja nicht. Ich habe in Blatt 1 eine Tabelle und möchte in Blatt 2 eine Tabelle mit der gleichen Zeilen Anzahl haben. Ich erweitere die Tabelle auf Blatt 1 mittels VB und Ziel wäre jetzt einfach die zweite Tabelle zu erweitern. Es handelt sich um eine Tabelle und nicht nur eine Liste.

    ListObjects kennt den Begriff Resize nicht. Auch Select mag er nicht haben.

    Das ganze drumherum mit Excel habe ich ganz gut im Griff (für meine bescheidene Verhältnisse).

    Schon mal Danke an Kasi und DKSKSM.
    Schönen Sonntag allen.
    Du solltest dir die Beispiele schon auch ansehen und damit herumexperimentieren.
    Eine Umsetzung von ListObjects in VB.NET (Interop.Excel) habe ich tatsächlich auch nicht gesehen.
    Bei mir funktioniert folgender VBA-Code

    Quellcode

    1. Worksheets("Tabelle1").Activate
    2. 'Find the last non-blank cell in column A(1)
    3. lRow = Cells(Rows.Count, 1).End(xlUp).Row
    4. 'Find the last non-blank cell in row 1
    5. lCol = Cells(1, Columns.Count).End(xlToLeft).Column
    6. Selection.Resize(lRow + 1, lCol).Select


    Wie so ein ähnlicher Code in VB.Net aussieht, hat @Kasi ja schon gezeigt.

    Nachtrag: Wenn es sich um eine Tabelle handelt, warum ermittelst du nicht die letzte Zeile (Code steht ja schon hier) und schreibst dann direkt drunter den neuen Datzensatz?
    Ich habe in Blatt 1 eine Tabelle und möchte in Blatt 2 eine Tabelle mit der gleichen Zeilen Anzahl haben. Ich erweitere die Tabelle auf Blatt 1 mittels VB und Ziel wäre jetzt einfach die zweite Tabelle zu erweitern. Es handelt sich um eine Tabelle und nicht nur eine Liste.

    ListObjects kennt den Begriff Resize nicht. Auch Select mag er nicht haben.

    Das ganze drumherum mit Excel habe ich ganz gut im Griff (für meine bescheidene Verhältnisse).


    willst du das jetzt mit .NET oder mit VBA machen ?

    wenn du Tabelle1 und Tabelle2 genau gleich haben willst dann einfach kopieren,
    ich verstehe dieses "erweitern" von dir nicht

    wenn das eine art Backup der Tabelle ist, dann solltest du in eine andere/neue Excelmappe schreiben/verwenden
    Worksheet(1) enthält die Rohdaten, geliefert von meiner VB App aus einer Datenbank. Worksheet(2) wird Berechnungen mit den Daten enthalten aus denen sich dann später PivotTabellen ableiten lassen. Beispiel erste Ziffer aus Spalte Worksheet(1) Spalte A.
    Erweitert man eine Tabelle werden diese Funktionen automatisch mit erweitert. Klar könnte ich das in Code packen aber dann kann ja nur ich diese Arbeitsmappe bearbeiten. Es ist deutlich Anwenderfreundlicher wenn das der Nutzer tun kann.
    Es geht bei meiner Frage auch nicht um das ermitteln der ursprünglichen Tabellen Größe, das war mir soweit schon klar. Es geht um die Veränderung der Größe von Worksheet(2)-Tabelle.

    Und ja, es soll in VB funktionieren. Für VBA hatte ich die Lösung oben erwähnt.

    Alexprivat schrieb:

    Worksheet(1) enthält die Rohdaten, geliefert von meiner VB App aus einer Datenbank.


    Access kann PIVOT-Tabellen erstellen, sollten deine Daten dort sein.
    Sorry wenn ich soviele Fragen stellen aber ist das dein Ablauf..
    --> Daten aus Datenbank nach Excel Importieren
    ---> Daten dort in Tabelle1 ???? sortieren oder ???
    -----> aus Tabelle1 in Tabelle2 Funktionen erstellen ?? was geschieht dort ?

    wenn die Daten schon in einer Datenbank sind macht es wenig sinn über Excel zugehen,
    wenn die Datanbank PIVOT beherrscht
    Guten Morgen,

    ich benötige Berechnungen aus der Tabelle mit den Rohdaten (Arbeitszeiten, TextFunktionen, Plausibilitäten...). Ich möchte diese Berechnungen aber nicht in der gleichen Tabelle durchführen falls sich mal Spalten ändern, neue Daten dazu kommen oder andere entfernt werden. Die Formeln sollen auch nicht aus der VB.net App kommen, die Excel Datei wird später an mehrere Stellen verteilt.
    Im Grunde möchte ich eigentlich nur auf 2 Arbeitsblättern die Größe der Tabellen gleich halten. Die gewünschte Größe ist ermittelt und ich suche nach einer Möglichkeit mittels VB.net und Interop.Excel die Größe einer Tabelle anzupassen. Kein Access, kein Pivot aus Datenbank, nur eine Möglichkeit die Resize Funktion aus VBA in VB.net zu nutzen oder einen alternativen Lösungsweg mit diesem Ergebnis.

    Danke
    Alex

    Alexprivat schrieb:

    ListObjects
    Nein.
    ListObjects ist eine Auflistung von ListObject-Objekten.

    Was du vermutlich syntaktisch suchst ist

    VB.NET-Quellcode

    1. ​XLWB.Worksheets(1).Listobjects(1).Resize (XLWB.Worksheets(1).Range("A1:C5"))

    Inhaltlich musst du es deinen Gegebenheiten anpassen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Alexprivat schrieb:


    Im Grunde möchte ich eigentlich nur auf 2 Arbeitsblättern die Größe der Tabellen gleich halten. Die gewünschte Größe ist ermittelt und ich suche nach einer Möglichkeit mittels VB.net und Interop.Excel die Größe einer Tabelle anzupassen......

    oder einen alternativen Lösungsweg mit diesem Ergebnis.

    Danke
    Alex


    hiermit wird von Tabelle1 in Tabelle2 kopiert, du kannst ja nicht die Range im vorraus wissen
    wie es nächstes Jahr aussieht.

    es richtet sich hier immer nach Tabelle1, also wenn Tabelle1 zeilen oder spalten sich ändern dann
    dies hier ausführen, und Tabelle2 wird angepasst

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim Path As String = "E:\a9CopyTest.xlsx" 'die Datei
    3. Dim Excel As ApplicationClass = New ApplicationClass
    4. Dim WorkBook As Workbook = Excel.Workbooks.Open(Path)
    5. Dim WorkSheets As Sheets = WorkBook.Sheets
    6. 'kopiere Tabelle 1
    7. Dim WorkSheet As Worksheet = CType(WorkSheets(1), Microsoft.Office.Interop.Excel.Worksheet)
    8. 'nach Tabelle2
    9. Dim WorkSheet2 As Worksheet = CType(WorkSheets(2), Microsoft.Office.Interop.Excel.Worksheet)
    10. Dim ColRange = ColumnIndexToColumnLetters(WorkSheet.UsedRange.Columns.Count)
    11. Dim rowRange = WorkSheet.UsedRange.Rows.Count 'used rows
    12. WorkSheet.UsedRange.Copy(WorkSheet2.Range("A:" & ColRange)) '<-- dynamisch ermittelt
    13. WorkBook.Save()
    14. Excel.Application.Quit()
    15. End Sub
    16. Private Function ColumnIndexToColumnLetters(colIndex As Integer) As String
    17. 'source von: https://www.add-in-express.com/creating-addins-blog/2013/11/13/convert-excel-column-number-to-name/
    18. Dim div As Integer = colIndex
    19. Dim colLetter As String = String.Empty
    20. Dim modnum As Integer = 0
    21. While div > 0
    22. modnum = (div - 1) Mod 26
    23. colLetter = Chr(65 + modnum) & colLetter
    24. div = CInt((div - modnum) \ 26)
    25. End While
    26. Return colLetter
    27. End Function


    probiers aus, ändere oder füge Spalten und Zeilen hinzu
    und kopiere dann, die Range musst du nicht mehr 'händisch' angeben

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