Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
748to752
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
748to752
748to752
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Sitzordnung

Sitzordnung
02.04.2006 18:31:18
Matthias
Bin auf die Seite gestoßen, da ich auf der Suche nach Hilfe für ein VBA-Projekt mit Excel bin.
Es soll ein Makro erstellt werden, mit die Möglichkeit besteht, eine (Excel-)Liste mit den Namen von Studenten von einer beliebigen Quelle auf dem Rechner einzulesen. Als Beispiel habe ich die folgende Liste als .doc hochgeladen (kann die Liste auch als Excel-Blatt zusenden):
https://www.herber.de/bbs/user/32546.doc
Jedem Namen soll eine Nummer zugewiesen werden, anschließend sollen dann die Nummern zufällig gemischt werden. Das ganze soll dazu dienen, daß die Sitzordnung während einer Klausur zufällig erstellt werden kann. Es soll dann die Möglichkeit bestehen, einen kleinen Zettel mit dem Namen des Studenten und der Zufallszahl auszudrucken.
Das Problem ist, daß ich mich zwar mit Excel ganz gut auskenne, aber noch nie mit VBA in Excel gearbeitet habe.
Ich wäre für Hilfe wirklich sehr dankbar, da ich keinen Plan habe, wie ich das oben genannte Problem ohne VBA-Kenntnisse angehen soll.

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sitzordnung
ransi
Hallo Matthias
"...von einer beliebigen Quelle auf dem Rechner einzulesen. "
Das habe ich nicht verstanden.
Darum mal ein ansatz mit Formel:
 
 ABCD
1NOMPRENOM  
2AGUESSEFrédéric0,8064596416
3ALBICKERMartin0,3592141854
4ALEKSANDROVTsvetan0,0538205791
5ARNOULTTiffanie0,7831064918
6ARVIEUMarie-Florence0,1001770283
7BARTHCaroline0,0498755392
8BAURVanessa0,038904894
9BERTHOLONBertrand0,2953243562
10BESSONClaire0,5917206632
11BLAESEstelle0,4998859239
12BOIREAUElise0,5909962733
13BONGIOVANNIJeremy0,3856491550
14BOUBELThomas0,6715933829
15BOUDHARAicha0,929870715
16BUSSONMathilde0,4715413942
17CALLETAdeline0,2193134475
18CAPRAJulien0,0886596685
Formeln der Tabelle
C2 : =ZUFALLSZAHL()
D2 : =RANG(C2;$C$2:$C$101)
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Spalte C ausblenden.
1X F9 drücken und die Liste ist neu gemischt.
ransi
Anzeige
AW: Sitzordnung
02.04.2006 19:00:58
Matthias
Das ging ja wirklich schnell! Allerdings soll das ganze in einem Makro (?) auftauchen. Eine Liste (Excel) soll von dem Makro eingelesen werden (Festplatte, CD, etc.) und dann die Sortier-Operation ausgeführt werden. Dann soll die Möglichkeit bestehen, daß eine Etikette mit Namen und Zufallsnummer ausgedruckt wird. Das alles für eine Person, die nur als Anwender auftritt und sich nicht mit VBA auskennt. Besten Dank!
Mischcode
02.04.2006 19:18:20
Beate
Hallo Matthias,
anbei eine Lösung für das Mischen per Code. Das Makro liegt im Codefenster der Tabelle:
https://www.herber.de/bbs/user/32547.xls
Private Sub CommandButton1_Click()
    Application.ScreenUpdating = False
    Columns("D:D").ClearContents
    Range("OFFSET($D$2,,,COUNTA($A:$A)-1,1)").FormulaR1C1 = "=RC[-3]&"" ""&RC[-2]"
    Range("OFFSET($D$2,,,COUNTA($A:$A)-1,1)").Value = Range("OFFSET($D$2,,,COUNTA($A:$A)-1,1)").Value
    Application.Goto Reference:="OFFSET(R2C4,,,COUNTA(C1)-1,1)"
    'Mischcode von >>>Peter Haserodt<<< www.haserodt.de
    Dim i As Long, anz As Long
    Dim iTemp As Variant, iZ As Long
    anz = Selection.Cells.Count
    'beginne Zellen zu vertauschen
    For i = anz To 1 Step -1
        Randomize Timer
        iZ = Int((i * Rnd) + 1)
        iTemp = Selection.Item(iZ).Text
        Selection.Item(iZ) = Selection.Item(i).Text
        Selection.Item(i) = iTemp
    Next i
    Range("OFFSET($E$2,,,COUNTA($A:$A)-1,1)").FormulaR1C1 = "=ROW()-1&"".) ""&RC[-1]"
    Range("OFFSET($E$2,,,COUNTA($A:$A)-1,1)").Value = Range("OFFSET($E$2,,,COUNTA($A:$A)-1,1)").Value
    Range("E1").Value = "Mischung"
    Columns("D:D").Delete Shift:=xlToLeft
    Range("D2").Select
    Application.ScreenUpdating = True
End Sub



Gruß,
Beate
Anzeige
AW: Mischcode
02.04.2006 19:27:45
Matthias
ich habe nicht ganz verstanden, was mit "codefenster" gemeint ist und auch nicht, wofür der Code im Anschluß dient/was ich mit ihm machen muß. Ich habe jetzt das Excel-Blatt runtergeladen und das funktioniert im Prinzip genauso wie es in der Aufgabe gestellt ist. Allerdings bräuchte ich eine Funktion, die die Möglichkeit bietet kleine Etiketten zu erstellen und diese dann auszudrucken. Vielen Dank für die superschnelle Hilfe in diesem Forum!
AW: Mischcode
02.04.2006 20:22:13
Beate
Hallo Matthias,
wenn du mit Alt+F11 in die VBA-Umgegung wechselst, siehst du in meiner Datei das Makro im Codefenster von Tabelle 1, das ist damit gemeint.
Guckst Du: Wie und wo fügt man ein Makro bzw. Code ein
Was den Druck betrifft, könnte man doch die Spalte D am Codeende formatieren (Schrift/Zeilenhöhe/Spaltenbreite) und nur den genutzten Bereich der Spalte D ausdrucken. Und dann das Papier zerschneiden. Oder willst du wirklich auf Etiketten drucken?
Gruß,
Beate
Anzeige
Wegen "Etikette"
02.04.2006 20:31:12
Matthias
Danke für die Hilfe kann ich schon einmal sagen. Das Problem ist, daß in der Aufgabe danach gefragt wird, Etiketten auszudrucken ohne, daß noch einmal manuell von Hand vergrößert werden muß. Ich habe leider wirklich keinen Plan von VBA, kann deshalb nicht wirklich kosntruktiv sein, weil ich nicht weiß, was mit so einem Makro geht und was nicht. Gibt es für die "Etiketten" eine Lösung?
AW: Wegen "Etikette"
02.04.2006 21:44:50
Mario
Hi es geht mitvba
Private Sub cmdCreate() Dim varArray as Variant Dim recSales As Recordset' Recorset to create chart from Dim objExcel As New Excel.Application' Excel object DoCmd.Hourglass True' Turn on the Hourglass -- to encourage wait by User Set recSales = CurrentDb().OpenRecordset("qryMonthlySales")' recSales.MoveLast' Move to the last record to update record count recSales.MoveFirst' Move to the first record varArray = recSales.GetRows(recSales.RecordCount) recSales.Close' Close the recordset objExcel.Workbooks.Add' Add a new Excel workbook For intFld = 0 To UBound(varArray, 1)' Pass the values from the array into the Excel sheet For intRow = 0 To UBound(varArray, 2) objExcel.Cells(intRow + 2, intFld + 1).Value = varArray(intFld, intRow) Next Next ' Work on the data as desired using regular Excel commands -- simply prefix them with objExcel as with objExcel.Range("A1:C3").Select ' As with modifying a Chart -- see this: Set objChart = objExcel.ActiveChart With objChart .ChartType = xl3DArea .HasTitle = True' Add some titles .ChartTitle.Text = "Monthly Sales" .Axes(xlCategory).HasTitle = True .Axes(xlCategory).AxisTitle.Caption = . .Axes(xlValue).AxisTitle.Caption = "Sales" .Axes(xlSeriesAxis).HasTitle = True .Axes(xlSeriesAxis).AxisTitle.Caption = ".HasLegend = False End With objExcel.ActiveWorkbook.Close True, "C:\BegVBA\MnthSale.XLS"' Saving & closing Workbook ' Close Excel and free the memory Set objChart = Nothing Set objExcel = Nothing DoCmd.Hourglass False objExcel.Quit' Leave the Excel application Exit Sub End Sub
' -- or a more complext example of inserting data and creating a chart therefrom --
Public Sub CreateChart()
' To create an Excel chart from a recordset
Dim recSales As Recordset ' Recorset to create chart from
Dim varArray As Variant ' Array of entries from above
Dim objExcel As New Excel.Application ' Excel object
Dim objChart As Object ' Excel chart object
Dim intFields As Integer ' Number of fields in recordset
Dim intRows As Integer ' Number of rows in recordset
Dim intFld As Integer ' Loop index for fields
Dim intRow As Integer ' Loop index for rows
Dim strRange As String ' Range of Excel cells for data
On Error GoTo CreateChart_Err
' Turn on the hourglass before opening the recordset
DoCmd.Hourglass True
Set recSales = CurrentDb().OpenRecordset("qryxMonthlySales")
' Move to the last record so we get an accurate record count
recSales.MoveLast
' Copy the whole recordset into an array, and close the recordset
recSales.MoveFirst
varArray = recSales.GetRows(recSales.RecordCount)
' Determine the number of rows and fields in the array
intFields = UBound(varArray, 1)
intRows = UBound(varArray, 2)
' create a new workbook
objExcel.Workbooks.Add
' fill the years and close the recordset
recSales.MoveFirst
For intFld = 1 To intFields
objExcel.Cells(intRow + 1, intFld + 1).Value = recSales.Fields(intFld).Name
Next
recSales.Close
' Pass the values from the array into the Excel sheet
For intFld = 0 To intFields
For intRow = 0 To intRows
objExcel.Cells(intRow + 2, intFld + 1).Value = varArray(intFld, intRow)
Next
Next
' Determine the A1:C2-type reference for the range containing our data
strRange = "A1:" & Chr$(Asc("A") + intFields) & Format$(intRows + 2)
' Select the range in the Excel sheet and make it active
objExcel.Range(strRange).Select
objExcel.Range(Mid(strRange, 4)).Activate
' Insert a chart based on the active selection
objExcel.Application.Charts.Add
' Add some titles
Set objChart = objExcel.ActiveChart
With objChart
.ChartType = xl3DArea
.HasTitle = True
.ChartTitle.Text = "Monthly Sales"
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Caption = "Month"
.Axes(xlValue).HasTitle = True
.Axes(xlValue).AxisTitle.Caption = "Sales"
.Axes(xlSeriesAxis).HasTitle = True
.Axes(xlSeriesAxis).AxisTitle.Caption = "Year"
.HasLegend = False
End With
objExcel.ActiveWorkbook.Close True
' Close Excel and free the memory
Set objChart = Nothing
Set objExcel = Nothing
DoCmd.Hourglass False
CreateChart_Exit:
Exit Sub
CreateChart_Err:
' Tidy up - ensure all objects are cleared
Set objChart = Nothing
objExcel.ActiveWorkbook.Close False
objExcel.Quit
Set objExcel = Nothing
DoCmd.Hourglass False
MsgBox Err.Number & " - " & Err.Description
Resume CreateChart_Exit
End Sub
Anzeige
AW: Wegen "Etikette"
02.04.2006 22:16:11
Beate
Hallo Matthias,
nun mit Etikettendruck. Dafür gibt es jetzt das Tabelle2. Befüllt sich passend nach Buttonclick - Achtung, das Makro druckt! Eventuell für Probezwecke den Drucker anhalten:
https://www.herber.de/bbs/user/32553.xls
Gruß,
Beate
Mischen und Etikettendruck
02.04.2006 23:20:24
Beate
Hallo Matthias,
nimm diese Version (Drucker anhalten zu Testzwecken):
https://www.herber.de/bbs/user/32556.xls
(Je nach Excel-Version konnte es bei der vorigen zu Problemen kommen (TakeFocusOnClick auf False jetzt für den Commandbutton))
Gruß,
Beate
Anzeige
Noch eine Frage...
03.04.2006 07:31:40
Matthias
Zunächst einmal vielen Dank (!) an alle, die mir bis jetzt schon riesig geholfen haben wegen der Sitzordnung. Eine letzte Frage habe ich noch wegen der Formatierung. Ich studiere wie an den Namen ersichtlich in Frankreich und müßte die Texte, also z.B. "Mischen und Drucken" auf Französisch haben. Ist es möglich den Code anzupassen und wie macht man so etwas? Noch einmal vielen Dank, vor allem an Beate!
AW: Noch eine Frage...
03.04.2006 09:15:50
Beate
Hallo Matthias,
was hättest du denn gerne genau in dem Button stehen? Dann bau ich es dir ein.
Für Erklärung habe ich jetzt keine Zeit.
Gruß,
Beate
Und dazu 3 Antworten......
03.04.2006 18:01:00
Beate
Hallo Matthias,
zu deinen diversen Fragen:
1.) Eine Frage betrifft noch die Möglichkeit
Details an dem Makro zu verändern. Wie kann ich zum Beispiel den
Control-Button ändern, d.h. die Sprache in Französisch ändern?
- Auf der Symbolleiste "Steuerelement Toolbox" den Button "Entwurfsmodus" (Geodreieck) anklicken
- Dann den Command-Button mit der rechten Maustaste anklicken
- Eigenschaften mit links anklicken
- In der Zeile "Caption" die gewünschte Änderung vornehmen
- das Eigenschaftsfenster schließen
- Auf der Symbolleiste "Steuerelement Toolbox" den Button "Entwurfsmodus beenden" (Geodreieck) anklicken
- fertig
2.) Wie kann man sich unter Excel den Code anzeigen lassen?
In die VBA-Umgebung kommst du mit Alt+F11. Das schrieb ich dir schon. Und dort liegt das Makro im Codefenster von Tabelle1 der Datei Mischen.xls. Die muss im VBA-Projektfenster markiert sein (blau unterlegt), dann siehst du den Code dieses Fensters im Copdefenster.
3.) Makrointerpretation (mit Hochkomma auskommentiert):
Private Sub CommandButton1_Click() 'Bildschirmauffrischung wird ausgeschaltet, damit alles optisch ruhig verläuft: Application.ScreenUpdating = False 'In Spalte D werden die Zeilen soweit wie nötig mit der Formel ausgestattet, 'die die Inhalte aus Spalten A & B verbindet: Range("OFFSET($D$2,,,COUNTA($A:$A)-1,1)").FormulaR1C1 = "=RC[-3]&"" ""&RC[-2]" 'In Spalte D wird die Formel durch kopieren und einfügen an gleicher Stelle 'in Werte gewandelt: Range("OFFSET($D$2,,,COUNTA($A:$A)-1,1)").Value = Range("OFFSET($D$2,,,COUNTA($A:$A)-1,1)").Value 'Spalte D wird der genutzte Bereich dynmamisch markiert '(je nachdem, wieviel Namen du hast): Application.Goto Reference:="OFFSET(R2C4,,,COUNTA(C1)-1,1)" 'Mischcode von >>>Peter Haserodt<<< www.haserodt.de 'er durchmischt den markierten Bereich in Spalte D: Dim i As Long, anz As Long Dim iTemp As Variant, iZ As Long anz = Selection.Cells.Count 'beginne Zellen zu vertauschen For i = anz To 1 Step -1 Randomize Timer iZ = Int((i * Rnd) + 1) iTemp = Selection.Item(iZ).Text Selection.Item(iZ) = Selection.Item(i).Text Selection.Item(i) = iTemp Next i 'In Spalte E wird wieder längendynamisch eine Formel eingefügt die zum einen 'die neue Mischung nummeriert und zum 'anderen diese Nummern mit dem Inhalt aus Spalte D verbindet: Range("OFFSET($E$2,,,COUNTA($A:$A)-1,1)").FormulaR1C1 = "=ROW()-1&"".) ""&RC[-1]" 'In Spalte E wird die Formel durch kopieren und einfügen an gleicher 'Stelle in Werte gewandelt: Range("OFFSET($E$2,,,COUNTA($A:$A)-1,1)").Value = Range("OFFSET($E$2,,,COUNTA($A:$A)-1,1)").Value 'Zelle A2 wird in Tabelle1 selektiert, damit es nacher aufgeräumt aussieht: Range("A2").Select 'von Uwe Küstner: 'sein Code kopiert nun der Reihe nach immer 4 Namen nebeneinander in Tabelle 2 'ausgehend von Tabelle1 Spalte E: Dim WsQ As Worksheet Dim WsZ As Worksheet Set WsQ = Worksheets("Tabelle1") Set WsZ = Worksheets("Tabelle2") 'Das Zielblatt Wsz wird selektiert und geleert: WsZ.Select WsZ.Cells.ClearContents 'nun werden die 4er-Blöcke kopiert: For iZ = 2 To WsQ.Range("E2").End(xlDown).Row Step 4 WsQ.Range(WsQ.Cells(iZ, 5), WsQ.Cells(iZ + 3, 5)).Copy WsZ.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) _ .PasteSpecial , Transpose:=True Next iZ 'In Tabelle2 wird Zeile 1 gelöscht, weil die durch den Code leer bleibt, 'da die Etiketten keine Überschriftenzeile haben: WsZ.Rows("1:1").Delete Shift:=xlUp 'Zwischenablage wird geleert, um den PC zu entlasten: Application.CutCopyMode = False 'In Tabelle 2 wird der Druckbereich festgelegt, damit er dynamisch 'von der Zahl der Einträge in Spalte A ist und immer 4 Spalten breit: WsZ.PageSetup.PrintArea = ("OFFSET(Tabelle2!$A$1,,,COUNTA(Tabelle2!$A:$A),4)") 'In Tabelle1 werden nun die jetzt überflüssigen Spalten D und E gelöscht WsQ.Columns("D:E").Delete Shift:=xlToLeft 'Bildschirmaufftischung wird wieder eingeschaltet: Application.ScreenUpdating = True 'A1 aktivieren >>>Peter <a href="Haserodt<<<http://www.online-excel.de/excel/singsel_vba.php?f=115">Haserodt<<<http://www.online-excel.de/excel/singsel_vba.php?f=115</a> 'das erscheint etwas umständlich, ist aber ein Weg, um in anderen Tabellenblättern 'Zellen zu selektieren, da unser Command-Button ja in Tabelle1 liegt und ich will den 'Cursor in A1 von Tabelle2 lenken, damit auch dieses Blatt ordentlich erscheint: WsZ.Range("a1").Copy WsZ.Range("a1").PasteSpecial (xlPasteFormats) 'Druckauftrag für Tabelle2 (wirkt sich auf den oben definierten Druckbereich aus): WsZ.PrintOut End Sub
Gruß,
Beate
Anzeige
Alles super - Dank an Beate
03.04.2006 18:27:00
Matthias
Wollte mich auf diesem Weg für die Hilfe seit gestern bedanken (vor allem bei Beate). Hätte vorher nicht gedacht, daß ich auf diesem Wege so schnell eine Lösung finde.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige