2011-01-11 7 views
0

Ich habe versucht, ein Makro (in Schritten) zu schreiben, um die Ergebnisse einer sehr schlecht gestalteten Umfrage zu organisieren, aber ich habe sehr wenig Glück. HierBrauchen Sie Hilfe mit Excel-Makro, um eine vermasselte Umfrage zu organisieren

ist eine Probe von dem, was ich habe:

alt text

Hier ist ein Beispiel von dem, was ich brauche:

alt text

ich in mehrere Probleme leite, von denen ist, dass nicht alle der 15 Fragen beantwortet werden mussten, was ein reibungsloses Durchschleifen der Ergebnisse schwierig macht.

Ein noch größeres Problem (verbunden mit dem vorherigen Problem) ist, dass 3 der 15 Fragen auf der Umfrage "Select All That Apply" Typ Fragen waren, und jede Auswahl wurde als separate Antwort aufgezeichnet, aber mit der gleichen Nummer . Zum Beispiel hatte Frage 10 11 mögliche Auswahlen, die ein Benutzer so viele oder so wenige von ihnen wählen konnte, wie sie wollten. Wenn sie die erste und dritte Option von Frage 10 auswählten, würde das Ergebnis wie die Zeilen 3 und 4 meines Beispiels What I have aussehen.

Meine What I need Beispiel zeigt, dass ich alle Fragen in Spalten und alle Befragten Zahlen in einer eigenen Zeile benötigen, mit den langen Antworten von einem Befragten unter ihrer jeweiligen Nummer.

Die ID Spalte aus dem What I have Beispiel wird im Endprodukt nicht benötigt, aber ich habe es in den Ergebnissen gelassen, um zu denken, dass es irgendwie helfen könnte, dieses Durcheinander zu sortieren.

Ich frage mich, ob ich einfach zurück zu der Person gehen sollte, die mir das gab und ihnen sagen, es tut mir leid, aber ich kann nichts damit machen, weil es so durcheinander ist. Wenn Sie denken, dass es möglich ist, diese Umfrageergebnisse zu korrigieren, geben Sie mir bitte einige Hinweise (seien Sie detailliert, ich habe nicht viel Erfahrung mit VB Script).

Alle anderen Kommentare, Gedanken oder Vorschläge sind ebenfalls willkommen.

+0

Diese nicht durcheinander ist, ist es ein ziemlich Standard-Ansatz eine Umfrage. Es wäre sehr einfach, in einer Datenbank zu analysieren, oder Sie können SQL in Excel verwenden. Welchen Ansatz hast du? – Fionnuala

+0

@Remou Ich habe viel mehr SQL-Erfahrung als ich VB Script (MySQL). Ich würde es gerne in Excel lassen (und SQL verwenden, wie Sie es vorgeschlagen haben), wenn möglich, aber wenn Sie denken, es in eine Datenbank zu bringen, wäre einfacher, ich werde diesen Weg gehen. – ubiquibacon

+0

Okay, ich werde zu dir zurückkommen, wenn jemand anderes mich nicht dazu schlägt :) – Fionnuala

Antwort

1

Ich habe jahrelange Erfahrung mit VBA in Excel und Access 2003 und 2010, und ich kann Ihnen sagen, dass es nicht Spaß machen würde, in Excel zu verarbeiten; basierend auf der Struktur der Umfrageergebnisse, würde ich wärmstens empfehlen, dies in Access zu importieren (wenn Sie es haben) und SQL-Abfragen auszuführen, um die Daten zu zerlegen und zu würfeln. Es ist wirklich im Format einer Datenbanktabelle, es hat sogar einen Primärschlüssel (ID).

+0

Es wäre nicht so schlimm. Sie können eine Jet-Verbindung, ADO und SQL in Excel ohne allzu große Schwierigkeiten verwenden. – Fionnuala

+0

Nun, es wäre nicht so schlimm, aber ich denke in Access könnte er ein paar schnelle SQL-Abfragen schreiben und/oder einen schönen Bericht über die Umfrage erstellen. –

+0

Ich habe dies in eine Access-Datenbank importiert und ich werde sehen, was ich tun kann. – ubiquibacon

0

Ich würde das in eine Datenbank importieren dann verwenden Sie eine einfache Abfrage oder zwei, um zu generieren, was Sie wollen.

0

Hier ist ein Start in Excel VBA, in Access ist dies eine ziemlich einfache Abfrage.

Dim cn As Object 
Dim rs As Object 
Dim strFile As String 
Dim strCon As String 
Dim strSQL As String 
Dim s As String 
Dim i As Integer, j As Integer 

''This is not the best way to refer to the workbook 
''you want, but it is very convenient for notes 
''It is probably best to use the name of the workbook. 

strFile = ActiveWorkbook.FullName 

''Note that if HDR=No, F1,F2 etc are used for column names, 
''if HDR=Yes, the names in the first row of the range 
''can be used. 
''This is the Jet 4 connection string, you can get more 
''here : http://www.connectionstrings.com/excel 

strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ 
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

''Late binding, so no reference is needed 
Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 


cn.Open strCon 

''Note that strings are case-sensitive 
strSQL = "Transform First(a.Answer) As Ans " _ 
     & "SELECT a.Respondent " _ 
     & "FROM [Sheet2$] As b " _ 
     & "LEFT JOIN " _ 
     & "(SELECT ID,Val(Question & '.' & " _ 
     & "IIf(Mid(Answer,5,8)='Checkbox', Mid(Answer,1,1),1)) As Qstn, " _ 
     & "Respondent,Answer " _ 
     & "FROM [Sheet1$]) As a " _ 
     & "ON a.[Qstn]=b.[Question] " _ 
     & "GROUP BY a.Respondent " _ 
     & "PIVOT b.question" 


rs.Open strSQL, cn, 3, 3 

''Pick a suitable empty worksheet for the results 
For i = 0 To rs.fields.Count - 1 
    Worksheets("Sheet3").Cells(1, i + 1) = rs.fields(i).Name 
Next 

Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs 

''Tidy up 
rs.Close 
Set rs = Nothing 
cn.Close 
Set cn = Nothing 

Dies basiert auf sheet2 eine Tabelle auf, die, wie so:

Question 
1.1 
2.1 
3.1 
4.1 
5.1 
6.1 
7.1 
8.1 
9.1 
9.2 
9.3 
9.4 
10.1 
10.2 
10.3 
10.4 
11.1 
11.1 
11.1 
11.1 
11.1 
<...> 
+0

Ich schätze all die Mühe, die Sie in dieses Thema stecken, aber nachdem ich die Umfrageergebnisse in Access importiert habe, denke ich, dass einige Abfragen alles aussortiert haben werden. Ich habe mich hauptsächlich mit MySQL beschäftigt, daher bin ich mit der in Access verwendeten SQL Server-Syntax ein wenig nicht vertraut, aber ich arbeite daran. – ubiquibacon

+0

Nun, wie ich schon sagte, ist es Standard-Datenbank-Format. Sie können die obige SQL-Anweisung abrufen, sie wird in Access mit sehr wenigen Änderungen ausgeführt, stellen Sie jedoch sicher, dass Sie eine Fragetabelle wie die oben abgebildete hinzufügen und die Tabellennamen anstelle der Blattnamen verwenden. – Fionnuala