none
per Visual Basic 2013 beliebige Zellen aus Excel datei auslesen, anzeigen, und in eine neue excel Datei speichern RRS feed

  • Frage

  • Hallo

    für mein Problem und zum lernen würde ich mir folgendes wünschen:

    Form1, 4 Buttons, 3 TextBoxen alles ohne neue Namen

    in der Form1, Variablen, wo und wie benennen

    muss noch was externes mit eigfügt werden, wo und wie

    Button1

    eine Excel Datei öffnen z.B. D:\Projekt\neue_daten.xlsx

    3 beliebige Zellen auslsen, und per TextBox 1,2,3 anzeigen

    Button2

    nochmal 3 beliebige Zellen aus lesen und in die vorhandene Datei test.xlsx in beliebige Zellen schreiben

    muss diese Datei vorher auch geöffnet werden

    Button3

    die 3 Werte aus den TextBoxen auch nach test.xlsx screiben

    Botton4

    Dateiei/n schliessen

    Programm beenden

    Ich denke wenn mir das einer als Test und Lerngrundlage machen würde

    käme ich gut weiter. Das was dazwichen passiert bekomme ich ich wahrscheinlich hin.

    Vielen Dank im voraus, ein alter Knacker der sich freuen würde

    Montag, 21. August 2017 17:25

Antworten

  • Hi,
    hier mal eine Demo, wie man das machen könnte:

    Imports System.ComponentModel
    Imports Microsoft.Office.Interop
    
    Public Class Form1
      Private WithEvents btn1 As New Button With {.Text = "Excel Datei öffnen", .Dock = DockStyle.Top}
      Private WithEvents btn2 As New Button With {.Text = "3 beliebige Zellen", .Dock = DockStyle.Top}
      Private WithEvents btn3 As New Button With {.Text = "3 Werte schreiben", .Dock = DockStyle.Top}
      Private WithEvents btn4 As New Button With {.Text = "schließen und beenden", .Dock = DockStyle.Top}
      Private tb1 As New TextBox With {.Dock = DockStyle.Top}
      Private tb2 As New TextBox With {.Dock = DockStyle.Top}
      Private tb3 As New TextBox With {.Dock = DockStyle.Top}
      Private inpFile As String = "c:\temp\neue_daten.xlsx"
      Private outFile As String = "c:\temp\test.xlsx"
      Private xlApp1 As Excel.Application
      Private xlApp2 As Excel.Application
      Private xlWb1 As Excel.Workbook
      Private xlWb2 As Excel.Workbook
      Private rnd As New Random
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.AddRange(New Control() {tb3, tb2, tb1, btn4, btn3, btn2, btn1})
      End Sub
    
      Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
        Try
          If xlApp1 Is Nothing Then xlApp1 = New Excel.Application
          xlWb1 = xlApp1.Workbooks.Open(inpFile)
          tb1.Text = GetCellValue(xlWb1)
          tb2.Text = GetCellValue(xlWb1)
          tb3.Text = GetCellValue(xlWb1)
        Catch ex As Exception
          MsgBox(ex.Message)
        End Try
      End Sub
    
      Private Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If xlApp2 Is Nothing Then xlApp2 = New Excel.Application
        If xlWb1 Is Nothing Then Exit Sub
        xlWb2 = xlApp2.Workbooks.Add
        SetCellValue(xlWb2, GetCellValue(xlWb1))
        SetCellValue(xlWb2, GetCellValue(xlWb1))
        SetCellValue(xlWb2, GetCellValue(xlWb1))
      End Sub
    
      Private Sub btn3_Click(sender As Object, e As EventArgs) Handles btn3.Click
        If xlApp2 Is Nothing Then Exit Sub
        If xlWb2 Is Nothing Then Exit Sub
        SetCellValue(xlWb2, tb1.Text)
        SetCellValue(xlWb2, tb2.Text)
        SetCellValue(xlWb2, tb3.Text)
      End Sub
      Private Sub btn4_Click(sender As Object, e As EventArgs) Handles btn4.Click
        SaveAndClose()
      End Sub
    
      Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        SaveAndClose()
      End Sub
    
      Private Sub SaveAndClose()
        If xlWb1 IsNot Nothing Then xlWb1.Close()
        If xlApp1 IsNot Nothing Then xlApp1.Quit()
        If xlWb2 IsNot Nothing Then
          xlWb2.SaveAs(outFile)
          xlWb2.Saved = True
          xlWb2.Close()
        End If
        If xlApp2 IsNot Nothing Then xlApp2.Quit()
      End Sub
    
      Private Function GetCellValue(wb As Excel.Workbook) As String
        Dim xlSheet As Excel.Worksheet = CType(wb.Worksheets(1), Excel.Worksheet)
        Dim item As Excel.Range = CType(xlSheet.Cells.Item(rnd.Next(1, 10), rnd.Next(1, 10)), Excel.Range)
        Return item.Value.ToString
      End Function
    
      Private Sub SetCellValue(wb As Excel.Workbook, value As String)
        Dim xlSheet As Excel.Worksheet = CType(wb.Worksheets(1), Excel.Worksheet)
        Dim item As Excel.Range = CType(xlSheet.Cells.Item(rnd.Next(1, 10), rnd.Next(1, 10)), Excel.Range)
        item.Value = value
      End Sub
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. August 2017 20:02

Alle Antworten

  • Hi,
    hier mal eine Demo, wie man das machen könnte:

    Imports System.ComponentModel
    Imports Microsoft.Office.Interop
    
    Public Class Form1
      Private WithEvents btn1 As New Button With {.Text = "Excel Datei öffnen", .Dock = DockStyle.Top}
      Private WithEvents btn2 As New Button With {.Text = "3 beliebige Zellen", .Dock = DockStyle.Top}
      Private WithEvents btn3 As New Button With {.Text = "3 Werte schreiben", .Dock = DockStyle.Top}
      Private WithEvents btn4 As New Button With {.Text = "schließen und beenden", .Dock = DockStyle.Top}
      Private tb1 As New TextBox With {.Dock = DockStyle.Top}
      Private tb2 As New TextBox With {.Dock = DockStyle.Top}
      Private tb3 As New TextBox With {.Dock = DockStyle.Top}
      Private inpFile As String = "c:\temp\neue_daten.xlsx"
      Private outFile As String = "c:\temp\test.xlsx"
      Private xlApp1 As Excel.Application
      Private xlApp2 As Excel.Application
      Private xlWb1 As Excel.Workbook
      Private xlWb2 As Excel.Workbook
      Private rnd As New Random
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.AddRange(New Control() {tb3, tb2, tb1, btn4, btn3, btn2, btn1})
      End Sub
    
      Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
        Try
          If xlApp1 Is Nothing Then xlApp1 = New Excel.Application
          xlWb1 = xlApp1.Workbooks.Open(inpFile)
          tb1.Text = GetCellValue(xlWb1)
          tb2.Text = GetCellValue(xlWb1)
          tb3.Text = GetCellValue(xlWb1)
        Catch ex As Exception
          MsgBox(ex.Message)
        End Try
      End Sub
    
      Private Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If xlApp2 Is Nothing Then xlApp2 = New Excel.Application
        If xlWb1 Is Nothing Then Exit Sub
        xlWb2 = xlApp2.Workbooks.Add
        SetCellValue(xlWb2, GetCellValue(xlWb1))
        SetCellValue(xlWb2, GetCellValue(xlWb1))
        SetCellValue(xlWb2, GetCellValue(xlWb1))
      End Sub
    
      Private Sub btn3_Click(sender As Object, e As EventArgs) Handles btn3.Click
        If xlApp2 Is Nothing Then Exit Sub
        If xlWb2 Is Nothing Then Exit Sub
        SetCellValue(xlWb2, tb1.Text)
        SetCellValue(xlWb2, tb2.Text)
        SetCellValue(xlWb2, tb3.Text)
      End Sub
      Private Sub btn4_Click(sender As Object, e As EventArgs) Handles btn4.Click
        SaveAndClose()
      End Sub
    
      Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        SaveAndClose()
      End Sub
    
      Private Sub SaveAndClose()
        If xlWb1 IsNot Nothing Then xlWb1.Close()
        If xlApp1 IsNot Nothing Then xlApp1.Quit()
        If xlWb2 IsNot Nothing Then
          xlWb2.SaveAs(outFile)
          xlWb2.Saved = True
          xlWb2.Close()
        End If
        If xlApp2 IsNot Nothing Then xlApp2.Quit()
      End Sub
    
      Private Function GetCellValue(wb As Excel.Workbook) As String
        Dim xlSheet As Excel.Worksheet = CType(wb.Worksheets(1), Excel.Worksheet)
        Dim item As Excel.Range = CType(xlSheet.Cells.Item(rnd.Next(1, 10), rnd.Next(1, 10)), Excel.Range)
        Return item.Value.ToString
      End Function
    
      Private Sub SetCellValue(wb As Excel.Workbook, value As String)
        Dim xlSheet As Excel.Worksheet = CType(wb.Worksheets(1), Excel.Worksheet)
        Dim item As Excel.Range = CType(xlSheet.Cells.Item(rnd.Next(1, 10), rnd.Next(1, 10)), Excel.Range)
        item.Value = value
      End Sub
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 21. August 2017 20:02
  • Hallo

    Erstmal vielen Dank für die promte Antwort. Leider ist das Beispiel, für meinen jetzigen Wissensstand

    noch komplex. Es würde mir mehr helfen, wenn der Anfangszustand tatsächlich einfach nur eine Form1 ist

    in die ich die Bottons und die TextBoxen ziehe und die Eigenschaften unangetastet bleiben. Die Datenzellen

    die ich in meinem Project auslesen und schreiben will sind weniger als 50 Zellen. Mir würde es vom

    verständnis her leichter fallen wenn im Beispiel die Zellen per A1, B4,D11 u.s.w. angesprochen würden.

    Nochmal zu Deinem Beispiel, ich habe mir den Code natürlich eingehend angeschaut. Gerade die Auswahl

    der Zellen verstehe ich nicht richtig, und wenn ich es testen möchte muss ich doch wahrscheinlich Buttons

    und Textfelder anpassen. Würde es Dir was ausmachen nochmal in die Tasten zu hauen ?

    Ich werde mich aber heute Nachmittag sofort an den Rechner setzten und versuchen se zum laufen zu

    bringen.

      Nochmal Besten Dank

    Dienstag, 22. August 2017 08:42
  • Hi,
    im Code hatte ich alle Deine Wünsche eingebaut. Den Code kannst Du in eine Form1 kopieren und brauchst nichts weiter zu machen. Er ist incl. Erstellen der Steuerelemente vollständig. Da brauchst Du keine Steuerelemente auf die Form ziehen. Das würde nur alles noch verkomplizieren. Es ist lediglich zusätzlich die PIA über Nuget hinzuzufügen (Microsoft.Office.Interop.Excel).

    Im Code arbeitest Du mit dem Excel-Objectmodel. Der Zugriff auf eine Zelle geht über Zeile und Spalte. Wenn Du mit A1 usw. arbeiten willst, dann solltest Du Dir eine entsprechende Konvertierungsroutine bauen bzw. mal in der Hilfe suchen, ob es da eine andere Zugriffsmöglichkeit gibt.

    In Meinem Beispiel werden die Zellen zufällig ausgewählt (über Random), so, wie Du es gefordert hattest.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 22. August 2017 09:53
  • Hallo

    Säter Nachmittag und ich bräuchte schon wider Hilfe

    Dein Beispiel läuft bei mir noch nicht. In vielen Zeilen werden Fehler angezeigt.

    Es geht nur um die letzten Zeilen Public Class Form1 wo Excel drin vorkommt. Das zweit, was

    ich nicht verstehe, was ist PIA über Nuget (Microsoft.Office.Interop.Excel)? Ich denke die Fehler haben wohl was damit zu tun. Ich finde aber nichts.

    Kannst Du mir da nochmal weiterhelfen?

         Vielen Dank

    Dienstag, 22. August 2017 16:38
  • Hi,
    sein Handwerkszeug sollte man schon etwas kennen:-)

    Hier mal ein paar Bilder:


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 22. August 2017 18:37