mikrocontroller.net

Forum: PC-Programmierung Zufallsgenerator Visual Basics


Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin, ich habe schon diverse seiten durchforstet, und nichts passendes 
gefunden.


Ich möchte gerne bei via VBA (Visual Studio 2017/ Windows frame App(.NET 
Framework))) einen Zufallsgenerator erstellen, der mir aus einer langen 
Liste (erstellt bei Excel) zufällige werte ausgibt.

Kann ich die Datei anhängen, und VBA drauf zugreifen lassen oder die 
Zellen in den code schnell Kopieren? (Es sind mehrer Hundert Wörter)

Autor: Peter M. (r2d3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
VBA ist normalerweise Visual Basic Code innerhalb des Offices-Paketes.
Visual Studio unterstützt Visual Basic.

Es ist ziemlich unklar, was Du eigentlich willst.
Was genau sind "mehrere hundert Wörter"?

: Bearbeitet durch User
Autor: Jetzt ist G. (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Zufaelliges auswaehlen geht. irgendwas mit Random().. schau mal ins 
Sprachmanual

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einige Listen mit ziemlich vielen Begriffen, wie zum beispiel:

Tisch
Stuhl
Tür
Schrank
Computer
etc.

und er soll mir daraus in einem Label einen zufälligen (bzw. mehrer 
begriffe aus mehrern tabellen) anzeigen.

Hab sowas gefunden, aber ich habe nicht nur 5 oder 20 begriffe sondern 
über 10 Tausend, alle in excel tabellen:

Public Class Form1

 Private Const Words() As String = { "Baum", "Hund", "Katze", "Haus" } 
'dies ist mega umständlich
 Private Rndm As New Random

 Public Function GetRandomWord()
  Return Rndm.Next(0, Words.Length)
 End Function

 Public Sub Button1_Click(ByVal Sender As Object, ByVal e As EventArgs) 
Handles Button1.Click
  TextBox1.Text = GetRandomWord()
 End Sub

End Class

Autor: Arc N. (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skippy schrieb:
> Hab sowas gefunden, aber ich habe nicht nur 5 oder 20 begriffe sondern
> über 10 Tausend, alle in excel tabellen:

Ist dort wo das Programm laufen soll Excel installiert?
Falls ja: 
https://docs.microsoft.com/de-de/dotnet/csharp/pro...
Falls nein: https://github.com/OfficeDev/Open-XML-SDK

Ansonsten: Daten in Excel als CSV exportieren und z.B. 
https://msdn.microsoft.com/en-us/library/microsoft... 
benutzen und einlesen

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja excel ist installiert

hab jetzt das in meinem code:

Imports Microsoft.Office.Interop

Public Class Form1
    Private Structure ExcelRows
        Dim C1 As String
        Dim C2 As String
        Dim C3 As String
        Dim C4 As String
        Dim C5 As String
        Dim C6 As String
        Dim C7 As String
        Dim C8 As String
        Dim C9 As String

    End Structure

    Private ExcelRowList As List(Of ExcelRows) = New List(Of ExcelRows)



    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles 
Button1.Click

        Me.OpenFileDialog1.FileName = Nothing

        If Me.OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK 
Then
            Me.TextBox1.Text = Me.OpenFileDialog1.FileName

        End If

        If getinfo() = True Then

            For Each xitem In ExcelRowList
                Dim lvitem As ListViewItem
                lvitem = Me.ListView1.Items.Add(xitem.C1)
                lvitem.SubItems.AddRange(New String() {xitem.C2, 
xitem.C3, xitem.C4, xitem.C5, xitem.C6, xitem.C7, xitem.C8, xitem.C9})
            Next

        End If

    End Sub

    Private Function getinfo() As Boolean
        Dim completet As Boolean = False

        Dim myexcel As New Excel.Application
        myexcel.Workbooks.Open(Me.TextBox1.Text)

        myexcel.Sheets("sheet1").activate()
        myexcel.Range("A2").Activate()

        Dim thisrow As New ExcelRows

        Do
            If myexcel.ActiveCell.Value > Nothing Or 
myexcel.ActiveCell.Text > Nothing Then

                thisrow.C1 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C2 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C3 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C4 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C5 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C6 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C7 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C8 = myexcel.ActiveCell.Value
                myexcel.ActiveCell.Offset(0, 1).Activate()

                thisrow.C9 = myexcel.ActiveCell.Value()

                ExcelRowList.Add(thisrow)

                myexcel.ActiveCell.Offset(1, -8).Activate()

            Else
                completet = True
                Exit Do
            End If
        Loop



        myexcel.Workbooks.Close()
        myexcel = Nothing
        Return completet

    End Function


End Class

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dabei läd er mir die tabellen in eine ListView.

kann diese verdeckt laufen lassen, und mir auf einer anderen seite mit 
einer massagebox oder label ein bestimmte zeile anzeigen lassen?

Autor: Peter M. (r2d3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möchtest Du in Visual Basic 2017 Deine Wortliste benutzen, die in einer 
Exceldatei steckt?

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter M. schrieb:
> Möchtest Du in Visual Basic 2017 Deine Wortliste benutzen, die in
> einer
> Exceldatei steckt?

Ja, ich möchte, dass er mir auf knopfdruck je ein wort aus jeder spalte 
anzeigt und zusammenbaut

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gesammte tabelle soll nicht angezeigtg werden, sondern nur die 
zufällige auswahl

Autor: Skippy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
das ist zum beispiel eine kleine tabelle, die ich zum test angelegt habe

Autor: Peter M. (r2d3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lösungsvorschlag:

Die Wortliste in Excel per VBA-Prozedur in eine Datei wegschreiben.
Die Exceldatei kann dann entfallen.

In VB2017 die Wortliste in eine Collection einlesen.

Die Zufallswortfunktion eine ganze Zufallszahl x von 1 bis (Länge der 
Collection) erzeugen lassen und dann das zugehörige wort(x) zurückgeben.

Zu Beginn Deines VB-Programms müsstest Du nur die Namensliste einmal in 
die Collection einlesen.

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das klingt recht gut, in was für eine Datei meinst du?

Autor: Skippy (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Könntest du vlt einen kleinen beispiel code schicken?

Autor: Peter M. (r2d3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skippy schrieb:
> Das klingt recht gut, was für eine Datei meinst du?

Bei dem Vorgang entsteht eine Textdatei, die Du auch mit einem Editor 
betrachten kannst.

Skippy schrieb:
> Könntest du vlt einen kleinen beispiel code schicken?

Schau Dir die VBA-Hilfe zu dem Wort "Print #-Anweisung" an.
Vorsicht, die VBA-Hilfe ist die Hilfe im VBA-Editor und nicht die in 
Excel auf den Tabellenblättern.
Da gibt es auch ein Stück Beispielcode.

Mit Hilfe dieses Befehls schreibst Du Deine Daten Stück für Stück 
sequentiell weg.
Du musst lediglich den Inhalt Deiner Excel-Tabelle(n) komplett 
durchlaufen.

In VB ist es noch einfacher, da musst Du nur die Wörter Stück für Stück 
einlesen.

: Bearbeitet durch User
Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Schau Dir die VBA-Hilfe zu dem Wort "Print #-Anweisung" an.
> Vorsicht, die VBA-Hilfe ist die Hilfe im VBA-Editor und nicht die in
> Excel auf den Tabellenblättern.
> Da gibt es auch ein Stück Beispielcode.

ok, danke, werde ich mir nachher mal anschauen.

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter M. schrieb

> In VB ist es noch einfacher, da musst Du nur die Wörter Stück für Stück
> einlesen.

Wo einlesen?

Autor: Wolfgang H. (drahtverhau)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst Du jetzt das ganze in Excel (VBA) machen oder doch in .NET (VB 
oder C#)?
Laut Deinem Code oben willst Du das in .NET machen...

Außerdem liest du scheinbar alle Zellen aus Excel zeilenweise aus und 
pumpst die dann hintereinander in eine Sammlung ( 
lvitem.SubItems.AddRange()...)

Dann sind die ja erstmal durcheinander... soll das so sein?

Autor: Peter M. (r2d3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skippy schrieb:
> Peter M. schrieb
>
>> In VB ist es noch einfacher, da musst Du nur die Wörter Stück für Stück
>> einlesen.
>
> Wo einlesen?

In die Collection.

Dein Problem besteht doch darin, Deine Wörtersammlung aus der Exceldatei 
Deiner Zufallsroutine in VB2017 verfügbar zu machen.

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Plan ist:

Ich möchte Verschiedene Button machen, wo sich verschiedene Fenster mit 
den jeweiligen Themen öffnet. dann klickt man auf einen knopf 
"berechnen", der einem dann jeder spalte einer tabelle einen wert 
zufällig raussucht und hintereinander anzeigt. Wie zum beispiel in der 
"schmiede" tabelle, dass er "Spezialist - Heimatschmiede - Wurfwaffen - 
3 - groß - Hochwertig - reichlich" anzeigt. und wenn man nochmal auf 
"berechnen" klickt, dass er dann eine neue auswahl zusammenstellt.
ich habe die Listen mit den Verschiedenen Themen (unter spalten 
unterteilungen) bereichen als einzelne Excel tabellen

Mit welchem Programm das geschieht ist mir relativ egal, da vorher fast 
keine programmier erfahrungen habe, und mir durch diverse Toturials und 
Internet seiten versucht habe in die Thematik reinzukommen

Autor: Peter M. (r2d3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skippy schrieb:
> Mein Plan ist:
>
> Ich möchte Verschiedene Button machen, wo sich verschiedene Fenster mit
> den jeweiligen Themen öffnet. dann klickt man auf einen knopf
> "berechnen", der einem dann jeder spalte einer tabelle einen wert
> zufällig raussucht und hintereinander anzeigt. Wie zum beispiel in der
> "schmiede" tabelle, dass er "Spezialist - Heimatschmiede - Wurfwaffen -
> 3 - groß - Hochwertig - reichlich" anzeigt. und wenn man nochmal auf
> "berechnen" klickt, dass er dann eine neue auswahl zusammenstellt.
> ich habe die Listen mit den Verschiedenen Themen (unter spalten
> unterteilungen) bereichen als einzelne Excel tabellen

Verstanden!

> Mit welchem Programm das geschieht ist mir relativ egal, da vorher fast
> keine programmier erfahrungen habe, und mir durch diverse Toturials und
> Internet seiten versucht habe in die Thematik reinzukommen

Dann kannst Du das Problem innerhalb von Excel lösen, und zwar mit der 
"Visual Basic"-Variante, die in jedem aktuellen Excel drinsteckt:
Visual Basic for Applications (VBA) => bei Internetrecherchen drauf 
achten, weil in VBA nicht alles aus der reinen Programmiersprache VB 
machbar ist.

Dein Problem ist simpel, für einen Anfänger ist es aber schon eine 
ordentliche Aufgabe.

Schau' Dir mal an,
was eine Prozedur ist
wie man eine Zufallszahl zwischen 1 und n generiert,
wie der Befehl MSGBOX funktioniert,
wie man auf den Inhalt einer Zelle aus VBA zugreift,
wie man Zeichenketten verknüpft,
wie man Schleifen programmiert.

: Bearbeitet durch User
Autor: Wolfgang H. (drahtverhau)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder anders herum...

Neues VB-Projekt im Studio. Per Designer eine LocalDB erstellen. Daten 
aus Excel importieren so wie hier: 
https://msdn.microsoft.com/de-de/library/cc464080%...

Naja... und dann irgendwas mit den daten machen. Somit wäre die ganze 
sache auch speicher und ladbar...

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang H. schrieb:
> Oder anders herum...
> Neues VB-Projekt im Studio. Per Designer eine LocalDB erstellen. Daten
> aus Excel importieren so wie hier:
> https://msdn.microsoft.com/de-de/library/cc464080%...
>
> Naja... und dann irgendwas mit den daten machen. Somit wäre die ganze
> sache auch speicher und ladbar...

Nach sowas habe ich gesucht, danke.

Ich dachte VBA würde für VB stehen... deswegen kam mir das zwischendurch 
komisch vor 😅

Aus einem dataset kann man ja recht einfach einen zufälligen wert 
anzeigen lassen.

Autor: Wolfgang H. (drahtverhau)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Aber eben bei 8 spalten 8 mal eine andere zeile auswählen!

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja werde nachher mal ein bisschen probieren, wie würde hier das dataset 
heissen, bzw. wie kann ich da wieder drauf zu greifen?

Dim DS As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
Dim MyConnection As System.Data.OleDb.OleDbConnection

MyConnection = New System.Data.OleDb.OleDbConnection( _
      "provider=Microsoft.Jet.OLEDB.4.0; " & _
      "data source=C:\myData.XLS; " & _
      "Extended Properties=Excel 8.0;")
' Select the data from Sheet1 of the workbook.
MyCommand = New System.Data.OleDb.OleDbDataAdapter( _
      "select * from [Sheet1$]", MyConnection)

DS = New System.Data.DataSet()
MyCommand.Fill(DS)
MyConnection.Close()

das ist das beispiel von der msn seite

Autor: Wolfgang H. (drahtverhau)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja... Und wenn du schon dabei bist dann lern es gleich richtig so wir 
hier erklärt: 
http://www.vb-paradise.de/index.php/Thread/94955-d...

Autor: Skippy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang H. schrieb:
> Achja... Und wenn du schon dabei bist dann lern es gleich richtig
> so wir hier erklärt:
> http://www.vb-paradise.de/index.php/Thread/94955-d...

Das hatte ich auch vor, wollte schon lange wissen wie es geht, habe nur 
nie einen anreiz gefunden mir sowas anzuschauen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.