Excelzellen per Schleife nacheinander auslesen, in Label anzeigen, durch Buttonclick in andere Zelle schreiben und weiterlesen

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von FloFuchs.

    Excelzellen per Schleife nacheinander auslesen, in Label anzeigen, durch Buttonclick in andere Zelle schreiben und weiterlesen

    Hallo Freunde der Programmierung!

    Folgendes Problem:

    Ich habe eine Excel Datei mit Textinhalten in den Zellen A2-A222. Diese sollen mittels VB gelesen werden und in einem Label nacheinander angezeigt werden. Dazu habe ich 2 Buttons mit der Bezeichnung "Ja" und "Nein". Durch das Drücken des Buttons1 ("Ja") soll in die Zellen B2-B222 eine 1 eingetragen werden, durch das Drücken des Buttons2 ("Nein") soll in die Zellen B2-B222 eine 0 eingetragen werden, je nachdem welchen der beiden Knöpfe man drückt.

    Als Beispiel: Form wird geladen, Inhalt von A2 wird in Label1 angezeigt. Ich drücke auf "Ja", in Excel wird in die Zelle B2 die Zahl 1 geschrieben (analog eine 0 falls ich auf "Nein" klicke) und in Label1 wird demzufolge der Inhalt von A3 angezeigt. Das Spielchen geht dann bis einschließlich zur Zelle A222.

    Meine erste Überlegung: Eine Schleife muss her!
    Meine zweite Überlegung: Ich habe zwei Buttons, die in die gleiche Schleife müssen.

    Ich könnte jetzt ganz banal nach einem Codebeispiel dafür fragen (und ich wäre wirklich froh falls jemand so etwas parat hätte :D ), aber ich befürchte dass man mich dann hasst.

    Also meine generellen Fragen: Welche Schleife empfiehlt sich dafür und sollte ich dafür einen Counter nehmen oder die Range definieren, da sie sich nicht ändert.

    Ich hoffe dass ihr mir zumindest für den Counter oder die Deklaration der Range ein Codebeispiel geben könnt.


    Vielen Dank schon mal an jeden Helfer!
    VB oder VBA?

    Da sich der Range nich ändert würde ich das ganze auch als Range nutzen.
    als schleife bietet sich for...each dann an. Du brauchst keine Buttons erstellen, sondern einfach eine MsgBox einblenden( dagibts verschieden Styles... für dich vbYesNo(glaub hieß so)) un dann einfach das ergebnis auswerten, dass diese zurück gibt.

    so in etwa...

    VB.NET-Quellcode

    1. Dim Zelle as Range
    2. for each Zelle in Range("A2:A222")
    3. MsgBox(Zelle.value & "Behalten?")
    4. if ergebnis = .... then
    5. zelle.offset....
    6. else
    7. ...
    8. next Zelle
    OK , sry ...
    Ich nehme an die Datei einlesen/ einbinden von Excel funktioniert schon?
    Wenn du die Namspace importiert hast kannste da auch drauf zu greifen.
    im endeffekkt ändert sich nicht allzuviel...
    auch den Range so definieren, mit ner For..each schleife durchlaufen, und halt entsprechend satttdessen die Zelle in dein Label schreiben.
    entsprechend dann im Button click ereignis einfügen...

    range.offset(1,0).value = 1

    Denk daran dass du die Range global definierst, damit du in den Click-Ereignissen der Buttons darauf zu greifen kannst
    Hallo FloFluchs,

    nochmal danke für die Hilfe. Könntest Du mir den Gefallen tun und den Codevorschlag nochmal etwas zusammenfassen? Ich brauche ja auf der einen Seite das Auslesen und Anzeigen Von A2-A222 und auf der anderen Seite nach dem Buttonclick das Schreiben in B2-B222.
    Jap, Excel ist offen und eine einzelne Zelle im Label anzeigen ist kein Problem.

    Mir geht es nur darum dass er eben mit dem Anzeigen von A2 beginnt, nach dem Click etwas in B2 schreibt und zu A3 springt und dann nach A222 aufhört.
    ok...
    also einen globalen Zähler erstellen .. i

    beim Form_Load einfügen...

    VB.NET-Quellcode

    1. dim i as integer = 2
    2. DeinLabel.text = deineRange("A2").value.tostring


    beim butten JA

    VB.NET-Quellcode

    1. if i >= 221 then
    2. deinRange.cells(1,i).offsett(1,0) = 1
    3. i=i+1
    4. DeinLabel.Text = deinArbeitsblatt(1,i).value.tostring
    5. else
    6. messagebox.show("Ende erreicht")
    7. end if


    beim butten NEIN

    VB.NET-Quellcode

    1. if i >= 221 then
    2. deinRange.cells(1,i).offsett(1,0) = 0
    3. i=i+1
    4. DeinLabel.Text = Arbeitsblatt(1,i).value.tostring
    5. else
    6. messagebox.show("Ende erreicht")
    7. end if

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

    Beim Debuggen gibt es direkt ne Fehlermeldung
    Fehlermeldung: Typkonflikt. (Ausnahme von HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))

    Dabei ist dann ToString grau markiert.


    Ich habe meine Range jetzt im FormLoad so definiert:

    VB.NET-Quellcode

    1. Dim rg As Excel.Range
    2. rg = MyExcel.Range("A2:A222")


    Meine Codezeile sieht dann wie folgt aus:

    VB.NET-Quellcode

    1. Label2.Text = rg("A2").Value.ToString


    Ist das so korrekt?

    Ach und noch am Rande: Ich möchte da keine MsgBox drin haben :)



    Auch stellt sich die Frage ob If-Schleifen hier Sinn machen?
    Eigentlich muss ja eine globale Schleife anfangen, die bei jeder Zelle anhält und auf den Click eines Buttons wartet. Ich überlege ob dies z.B. mit einer For-Each Schleife lösbar wäre?

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

    dann nimm sie halt raus.... das war auch eher als info für Dich gedacht dass dann das Ende des Range erreicht is!!!


    VB.NET-Quellcode

    1. Label2.Text = rg("A2").ToString


    mein Fehler... ohne value...

    Joa könntest du... Ich weiß allerdings nich wie man die For..each schleife auf die Clicks warten lassen soll...
    was dann wieder für das einblenden der abfrage sprechen würde... was genau is eig dagegen einzuwenden?
    Puh also das ist echt ziemlich festgefahren und ich komme da nicht weiter.. Ich poste mal meinen Code, in der Hoffnung dass mir dann jemand helfen kann:

    VB.NET-Quellcode

    1. Public Class Form3
    2. Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Button1.Hide()
    4. Button2.Hide()
    5. Label2.Text = "Klicken Sie auf Start um zu beginnen."
    6. Dim rg As Excel.Range
    7. Dim sFile As String
    8. Dim MyExcel As New Excel.Application
    9. Dim i As String = 2
    10. End Sub
    11. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Button3.Hide()
    12. Button1.Show()
    13. Button2.Show()
    14. sFile = "C:\Test\" & Form1.TextBox2.Text & "_" & Form1.TextBox1.Text & "\TestI" & "_" & Form1.TextBox2.Text & "_" & Form1.TextBox1.Text & ".xls"
    15. MyExcel.Workbooks.Open(sFile)
    16. MyExcel.Visible = True
    17. Label2.Text = rg("A2").ToString
    18. End Sub
    19. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    20. If i >= 221 Then
    21. MyExcel.Label2.Cells(1, i).offsett(1, 0) = 1
    22. i = i + 1
    23. Label2.Text = rg(1, i).value.ToString
    24. Else
    25. MessageBox.Show("Ende erreicht")
    26. End If
    27. End Sub
    28. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    29. If i >= 221 Then
    30. MyExcel.Label2.Cells(1, i).offsett(1, 0) = 0
    31. i = i + 1
    32. Label2.Text = rg(1, i).value.ToString
    33. Else
    34. MessageBox.Show("Ende erreicht")
    35. End If
    36. End SubEnd Class
    Bitte ganz oben Option Strict ON eingeben.
    Die Zählvariable i ist kein Text sondern ein INTEGER!!
    Gibts bei dir kein Intellisense???

    Was soll das denn werden???

    MyExcel.Label2.Cells(1, i).offsett(1, 0) = 1


    DU musst ma ein TAbellenblatt zuweisen.... nich nur ne Variable deklarieren!

    VB.NET-Quellcode

    1. Dim xlApp As Excel.Application = New Excel.Application
    2. Dim xlMappe As Excel.Workbook = xlApp.Workbooks.Open("D:\Users\Florian Fuchs\Documents\Visual Studio 2010\Projects\Test\Test.xlsx")
    3. Dim xlBlatt As Excel.Worksheet = xlMappe.Worksheets("Sheet1")
    4. Dim rg As Excel.Range = xlBlatt.Range("A2")
    5. Label1.Text = rg.Value.ToString

    sowas in der art....

    geh doch mal schritt für schritt dein pgm durch mit F8
    ja... aber bei der Lösung empfiehlt es sich dann doch eher mit den cells zu arbeiten. Wenn Du ne bessere Idee hast, gerne her damit. Aber die Zuweisung sollte dann natürlich stimmen, ich sehe was du meinst.

    Mein erster Lösungsansatz basierte auf dem benutzen von Messageboxen als Abfrage. Dort hätte man das ganze in eine For..each schleife packen können un den gesamten Range durchgehen.