VB2010 - Werte in Excel speichern und lesen?
lima-city → Forum → Programmiersprachen → Basic
bereich
button
code
datum
feld
formular
forum
http
platz
position
rang
set
sortieren
spalte
speichern
stehen
tabelle
textfeld
url
zahl
-
Hallo,
habe in Visual Basic einen Button und eine Combo Box.
Geht das, wenn ich auf dem Button1 drücke, soll der Text, der in der Combobox1 steht, in der Zelle A1 geschrieben wird und das was in A2 steht soll in ein Label anzeigt werden?
Vielen Dank
Philip -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Grundsätzlich ist das, was du vorhast, kein Problem:
http://burgi.lima-city.de/forum/dingenskirchen.xls
Das einzige Problem ist, dass du den Text des Bezeichnungsfeldes offensichtlich nicht ändern kannst, oder nur ich nicht
Ich finde dazu nicht die passende Eigenschaft, die nicht nur ReadOnly ist ...
In User-Formularen spricht man diese Eigenschaft mit .Caption an -
@burgi Danke schon mal für deine Antwort, aber ich meinte die Buttons und die Combobox sind in eine Form1 (wenn man das so nennt.)
-
Um dir helfen zu können, wäre es interessant:
- versuchst du von "außerhalb Excel" auf Excel zuzugreifen
oder
- hast du über die Entwicklertools eine "Userform" in Excel direkt angelegt? -
Sorry, wenn ich nochmal nachfrage:
du hast eine Excel-Tabelle, in der du ein Formular hast, dort trägst du Werte ein, und immer, wenn du die Schaltfläche drückst, sollen in der Tabelle ganz unten die Werte angefügt werden. Sehe ich das richtig?
Ich werde nämlich aus deinen Erklärungen noch nicht so richtig schlau
Programmierst du jetzt mit VBA direkt in Excel, oder mit Visual Studio / Visual Basic?
Edit: meinst du das so?
http://burgi.lima-city.de/forum/anderes-dinges.xls
Beitrag zuletzt geändert: 19.4.2011 23:18:47 von burgi -
das Formular ist in der Form1, siehe bilder
http://s1.directupload.net/file/d/2499/j6qxhtlu_jpg.htm
und
http://s7.directupload.net/file/d/2499/cd8bqcpg_jpg.htm
Vielen Dank schonmal
Philip
Edit:
Edit: meinst du das so?
http://burgi.lima-city.de/forum/anderes-dinges.xls
Nein, siehe oben, könntes du mir zeigen wie du das gemacht hast, das meinte ich zwar nicht aber mich interessiert das schon.
Beitrag zuletzt geändert: 19.4.2011 23:27:55 von philip-felder -
Ich verstehe jetzt, was du willst
Du willst aus Visual Basic mittels OLE-Automation Daten in Excel schreiben und dann speichern. Da ich kein VB installiert habe, schon gar nicht das 2010er, kann ich dir hier leider nicht weiterhelfen.
Du solltest dich hiermit beschäftigen: http://www.exceltip.com/st/Basic_information_about_OLE_automation_using_VBA_in_Microsoft_Excel/462.html
Es gibt noch wesenlich mehr hilfreiche Suchergebnisse bei Google, wenn man weiß, wonach man suchen muss
Du kannst trotzdem den Code aus den Makros aus der letzten Excel-Datei anschauen, so oder so ähnlich wird das auch aus VB 2010 heraus funktionieren.
Ich bin mir sicher, dass sich jemand hier im Forum finden wird, der dir weiterhelfen kann -
Habe jetzt beschloßen es über excel zu machen (wie burgi es meinte) ....
habe aber noch eine frage:
kann man 4 zahlen der größe ordnen und die größte zahl bekommt eine 1 und die danach eine 2 dann 3 bis 4?
Vielen Dank
Philip
-
Wenn du das nun in Excel machst, und die in die Tabelle geschriebenen Werte sortieren willst, kannst du (da du ja den Zeilenindex für das hinschreibend er Daten hast) eine Selection (also eine Markierung) anlegen, und dann die Daten von Excel selbst sortieren lassen, so als würdest du selbst in der Menüleiste rumklicken. Am Einfachsten machst du das, indem du ein Makro aufzeichnest, und nur den Aufruf für die Markierung modifizierst
-
Hallo philip-felder,
wenn die Zahlen in der Tabelle stehen, dann kannst Du sie mit der Range.Sort() Methode sortieren:
Beispiel:
Sub test() Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim rg As Excel.Range Dim i As Long Set wb = ActiveWorkbook Set ws = wb.Worksheets("Tabelle1") ' Erzeuge ein Range-Objekt für den zu sortierenden Bereich. ' Hier ist es der Bereich B1 bis einschließlich B4. Set rg = Range(ws.Cells(1, 2), ws.Cells(4, 2)) ' Sortieren: rg.Sort ws.Cells(1, 2) ' Schreibe die Zahlen 1 bis 4 in Spalte A For i = 1 To 4 ws.Cells(i, 1).Value = i Next End Sub
-
Die Werte stehen nicht in der Tabelle.
Also: Ich habe in einem UserForm 4 Textboxen und natürlich auch nen Button zu abschicken, so solles dann aussehen:
......................................A ...............................................................................................B
1 Die Zahl die in der Textbox steht (z.B. 1234).................. Hier soll der Platz stehen (z.B. 1)
2 Die Zahl die in der Textbox steht (z.B. 1233)..................Hier soll der Platz stehen (z.B. 2)
3 Die Zahl die in der Textbox steht (z.B. 121) ....................Hier soll der Platz stehen (z.B. 4)
4 Die Zahl die in der Textbox steht (z.B. 133)...................... Hier soll der Platz stehen (z.B. 3)
Ist das so möglich?
Edit:
(Punkte = Platzhalter)
Beitrag zuletzt geändert: 22.4.2011 22:58:29 von philip-felder -
Hallo philip-felder,
mit ein bisschen Tricksen ist das ganz einfach. Ich bin jetzt mal davon ausgegangen, dass die Textfelder txtNumber1bis txtNumber4 heißen.
Private Sub btnRun_Click() Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim rg As Excel.Range Dim i As Long Set wb = ActiveWorkbook Set ws = wb.Worksheets("Tabelle1") ' Kopiere die Werte in Spalte A ws.Cells(1, 1).Value = txtNumber1.Value ws.Cells(2, 1).Value = txtNumber2.Value ws.Cells(3, 1).Value = txtNumber3.Value ws.Cells(4, 1).Value = txtNumber4.Value ' Schreibe die Zahlen 1 bis 4 in Spalte C For i = 1 To 4 ws.Cells(i, 3).Value = i Next ' Erzeuge ein Range-Objekt für den zu sortierenden Bereich. ' Hier ist es der Bereich A1 bis einschließlich C4. Set rg = Range(ws.Cells(1, 1), ws.Cells(4, 3)) ' Sortieren nach den Zahlen: rg.Sort ws.Cells(1, 1) ' Schreibe die Zahlen 1 bis 4 in Spalte B: For i = 1 To 4 ws.Cells(i, 2).Value = i Next ' Sortieren nach der ursprünglichen Reihenfolge: rg.Sort ws.Cells(1, 3) ' Lösche die Positionsangaben in Spalte C: For i = 1 To 4 ws.Cells(i, 3).Value = Empty Next End Sub
-
@darkpandemic
Danke, geht das auch die größte Zahl bekommt ne 1?
Oder geht das dann auch horizontal?
Philip ;->
Beitrag zuletzt geändert: 22.4.2011 23:25:52 von philip-felder -
Hallo philip-felder,
wenn die Nummerierung umgekehrt sein soll, dann kannst Du entweder die Nummerierungsschleife ändern:
Oder Du sortierst absteigend:' Schreibe die Zahlen 1 bis 4 in Spalte B: For i = 1 To 4 ws.Cells(i, 2).Value = 5 - i Next
Wenn anstelle der Zeilen die Spalten sortiert werden sollen, dann kannst Du das fogendermaßen angeben:' Sortieren nach den Zahlen: rg.Sort ws.Cells(1, 1), Order1:=xlDescending
rg.Sort ws.Cells(1, 1), Orientation:=xlSortColumns
Beitrag zuletzt geändert: 22.4.2011 23:37:15 von darkpandemic -
So klappt es ganz gut, aber es ist wichtig das texbox1 in a1 steht, textbox2 in a2, usw.
und kann man den "Platz" von der Zahl auch in eine Variable speichern?
Beitrag zuletzt geändert: 22.4.2011 23:48:29 von philip-felder -
Hallo philip-felder,
dass in A1 der Wert aus Textbox 1 steht usw. ist dadurch gewährleistet, dass in Spalte C die ursprüngliche Position eingetragen wird und am Schluss danach sortiert wird.
Wenn Du willst, dann kannst Du im Anschluss den Platz direkt aus der Tabelle lesen:
Dann stehen die Plätze in rank().Dim rank(1 To 4) As Long ... For i=1 To 4 rank(i) = ws.Cells(i,2).value Next
Alternativ kannst Du auch alles in VBA machen:
Option Explicit Private Type NumberDescriptor Number As Long Position As Long Rank As Long End Type Private Sub NumberDescriptor_SortByNumber(arr() As NumberDescriptor, _ Optional ByVal start_idx As Long = -1, _ Optional ByVal end_idx As Long = -1) Dim i As Long Dim j As Long Dim tmp As NumberDescriptor Dim pivot As NumberDescriptor If start_idx < 0 Then start_idx = LBound(arr) If end_idx < 0 Then end_idx = UBound(arr) i = start_idx j = end_idx pivot = arr((start_idx + end_idx) / 2) Do While arr(i).Number < pivot.Number i = i + 1 Wend While arr(j).Number > pivot.Number j = j - 1 Wend If i <= j Then tmp = arr(i) arr(i) = arr(j) arr(j) = tmp i = i + 1 j = j - 1 End If Loop Until i > j If start_idx < j Then NumberDescriptor_SortByNumber arr, start_idx, j End If If i < end_idx Then NumberDescriptor_SortByNumber arr, i, end_idx End If End Sub Private Sub NumberDescriptor_SortByPosition(arr() As NumberDescriptor, _ Optional ByVal start_idx As Long = -1, _ Optional ByVal end_idx As Long = -1) Dim i As Long Dim j As Long Dim tmp As NumberDescriptor Dim pivot As NumberDescriptor If start_idx < 0 Then start_idx = LBound(arr) If end_idx < 0 Then end_idx = UBound(arr) i = start_idx j = end_idx pivot = arr((start_idx + end_idx) / 2) Do While arr(i).Position < pivot.Position i = i + 1 Wend While arr(j).Position > pivot.Position j = j - 1 Wend If i <= j Then tmp = arr(i) arr(i) = arr(j) arr(j) = tmp i = i + 1 j = j - 1 End If Loop Until i > j If start_idx < j Then NumberDescriptor_SortByPosition arr, start_idx, j End If If i < end_idx Then NumberDescriptor_SortByPosition arr, i, end_idx End If End Sub Private Sub btnRun_Click() Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim rg As Excel.Range Dim i As Long Dim numbers(1 To 4) As NumberDescriptor numbers(1).Number = txtNumber1.value numbers(1).Position = 1 numbers(1).Rank = 0 numbers(2).Number = txtNumber2.value numbers(2).Position = 2 numbers(2).Rank = 0 numbers(3).Number = txtNumber3.value numbers(3).Position = 3 numbers(3).Rank = 0 numbers(4).Number = txtNumber4.value numbers(4).Position = 4 numbers(4).Rank = 0 NumberDescriptor_SortByNumber numbers For i = 1 To 4 numbers(i).Rank = i Next NumberDescriptor_SortByPosition numbers Set wb = ActiveWorkbook Set ws = wb.Worksheets("Tabelle1") For i = 1 To 4 ws.Cells(i, 1).value = numbers(i).Number ws.Cells(i, 2).value = numbers(i).Rank Next End Sub
-
Alternativ kannst Du auch alles in VBA machen: Option Explicit Private Type NumberDescriptor Number As Long Position As Long Rank As Long End Type Private Sub NumberDescriptor_SortByNumber(arr() As NumberDescriptor, _ Optional ByVal start_idx As Long = -1, _ Optional ByVal end_idx As Long = -1) Dim i As Long Dim j As Long Dim tmp As NumberDescriptor Dim pivot As NumberDescriptor If start_idx < 0 Then start_idx = LBound(arr) If end_idx < 0 Then end_idx = UBound(arr) i = start_idx j = end_idx pivot = arr((start_idx + end_idx) / 2) Do While arr(i).Number < pivot.Number i = i + 1 Wend While arr(j).Number > pivot.Number j = j - 1 Wend If i <= j Then tmp = arr(i) arr(i) = arr(j) arr(j) = tmp i = i + 1 j = j - 1 End If Loop Until i > j If start_idx < j Then NumberDescriptor_SortByNumber arr, start_idx, j End If If i < end_idx Then NumberDescriptor_SortByNumber arr, i, end_idx End If End Sub Private Sub NumberDescriptor_SortByPosition(arr() As NumberDescriptor, _ Optional ByVal start_idx As Long = -1, _ Optional ByVal end_idx As Long = -1) Dim i As Long Dim j As Long Dim tmp As NumberDescriptor Dim pivot As NumberDescriptor If start_idx < 0 Then start_idx = LBound(arr) If end_idx < 0 Then end_idx = UBound(arr) i = start_idx j = end_idx pivot = arr((start_idx + end_idx) / 2) Do While arr(i).Position < pivot.Position i = i + 1 Wend While arr(j).Position > pivot.Position j = j - 1 Wend If i <= j Then tmp = arr(i) arr(i) = arr(j) arr(j) = tmp i = i + 1 j = j - 1 End If Loop Until i > j If start_idx < j Then NumberDescriptor_SortByPosition arr, start_idx, j End If If i < end_idx Then NumberDescriptor_SortByPosition arr, i, end_idx End If End Sub Private Sub btnRun_Click() Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim rg As Excel.Range Dim i As Long Dim numbers(1 To 4) As NumberDescriptor numbers(1).Number = txtNumber1.value numbers(1).Position = 1 numbers(1).Rank = 0 numbers(2).Number = txtNumber2.value numbers(2).Position = 2 numbers(2).Rank = 0 numbers(3).Number = txtNumber3.value numbers(3).Position = 3 numbers(3).Rank = 0 numbers(4).Number = txtNumber4.value numbers(4).Position = 4 numbers(4).Rank = 0 NumberDescriptor_SortByNumber numbers For i = 1 To 4 numbers(i).Rank = i Next NumberDescriptor_SortByPosition numbers Set wb = ActiveWorkbook Set ws = wb.Worksheets("Tabelle1") For i = 1 To 4 ws.Cells(i, 1).value = numbers(i).Number ws.Cells(i, 2).value = numbers(i).Rank Next End Sub
Wieder das selbe problem, die größte Zahl muss 1 haben.
Kann man das den auch in eine Variable speichern, ohne es in die Excel Tabelle zu schreiben ???
Beitrag zuletzt geändert: 23.4.2011 0:49:12 von cbhp -
Hallo philip-felder,
hier nochmal mit absteigender Sortierung:
Option Explicit Private Type NumberDescriptor Number As Long Position As Long Rank As Long End Type Private Sub NumberDescriptor_SortByNumber(arr() As NumberDescriptor, _ Optional ByVal start_idx As Long = -1, _ Optional ByVal end_idx As Long = -1) Dim i As Long Dim j As Long Dim tmp As NumberDescriptor Dim pivot As NumberDescriptor If start_idx < 0 Then start_idx = LBound(arr) If end_idx < 0 Then end_idx = UBound(arr) i = start_idx j = end_idx pivot = arr((start_idx + end_idx) / 2) Do While arr(i).Number > pivot.Number i = i + 1 Wend While arr(j).Number < pivot.Number j = j - 1 Wend If i <= j Then tmp = arr(i) arr(i) = arr(j) arr(j) = tmp i = i + 1 j = j - 1 End If Loop Until i > j If start_idx < j Then NumberDescriptor_SortByNumber arr, start_idx, j End If If i < end_idx Then NumberDescriptor_SortByNumber arr, i, end_idx End If End Sub Private Sub NumberDescriptor_SortByPosition(arr() As NumberDescriptor, _ Optional ByVal start_idx As Long = -1, _ Optional ByVal end_idx As Long = -1) Dim i As Long Dim j As Long Dim tmp As NumberDescriptor Dim pivot As NumberDescriptor If start_idx < 0 Then start_idx = LBound(arr) If end_idx < 0 Then end_idx = UBound(arr) i = start_idx j = end_idx pivot = arr((start_idx + end_idx) / 2) Do While arr(i).Position < pivot.Position i = i + 1 Wend While arr(j).Position > pivot.Position j = j - 1 Wend If i <= j Then tmp = arr(i) arr(i) = arr(j) arr(j) = tmp i = i + 1 j = j - 1 End If Loop Until i > j If start_idx < j Then NumberDescriptor_SortByPosition arr, start_idx, j End If If i < end_idx Then NumberDescriptor_SortByPosition arr, i, end_idx End If End Sub Private Sub btnRun_Click() Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim rg As Excel.Range Dim i As Long Dim numbers(1 To 4) As NumberDescriptor numbers(1).Number = txtNumber1.value numbers(1).Position = 1 numbers(1).Rank = 0 numbers(2).Number = txtNumber2.value numbers(2).Position = 2 numbers(2).Rank = 0 numbers(3).Number = txtNumber3.value numbers(3).Position = 3 numbers(3).Rank = 0 numbers(4).Number = txtNumber4.value numbers(4).Position = 4 numbers(4).Rank = 0 NumberDescriptor_SortByNumber numbers For i = 1 To 4 numbers(i).Rank = i Next NumberDescriptor_SortByPosition numbers ' Wenn die Werte nicht in die Tabelle geschrieben werden sollen, dann ' kannst Du alles Folgende weglassen. ' Der Platz steht in numbers().Rank Set wb = ActiveWorkbook Set ws = wb.Worksheets("Tabelle1") For i = 1 To 4 ws.Cells(i, 1).value = numbers(i).Number ws.Cells(i, 2).value = numbers(i).Rank Next End Sub
In diesem Fall steht erstmal alles in Variablen. Genauer gesagt im Array numbers.
Dabei ist numbers().Number die Zahl, numbers().Position die ursprüngliche Position bzw. die Nummer des Textfeldes und numbers().Rank der Platz.
Zwischen die Klammern gehört natürlich immer der Index (1,2,3 oder 4). Und solange Du die Werte nicht in die Tabelle kopierst bleiben sie auch da und sind sonst nirgends -
Vielen Dank,
so jetzt noch ein punkt, dann wäre alles geschaft:
in "ws.Cells(i, 2).Value = numbers(i).Rank" stehen ALLE "Plätze" kann man auch z.B. nur einen oder zwei an verschieden Zellen reinschreiben lassen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage