Нужна помощь с макросом Excel, чтобы организовать испорченный опрос

Я пытался написать макрос (пошагово), чтобы упорядочить результаты очень плохо разработанного опроса, но мне очень не повезло.

Вот пример того, что у меня есть:

альтернативный текст

Вот образец того, что мне нужно:

альтернативный текст

Я столкнулся с несколькими проблемами, одна из которых заключается в том, что не на все 15 вопросов опроса нужно было ответить, что затрудняет плавный просмотр результатов.

Еще большая проблема (связанная с предыдущим выпуском) заключается в том, что 3 из 15 вопросов в опросе были вопросами типа «Выберите все подходящие», и каждый выбор был записан как отдельный ответ, но с одним и тем же номером. Например, в вопросе 10 было 11 возможных вариантов ответа, из которых пользователь мог выбрать столько, сколько пожелает. Если бы они выбрали 1-й и 3-й варианты вопроса 10, результат выглядел бы как строки 3 и 4 моей выборки What I have.

Мой пример What I need показывает, что мне нужны все вопросы в столбцах и все номера респондентов в отдельной строке, с подробными ответами респондента под соответствующим номером.

Столбец ID из примера What I have не нужен в конечном продукте, но я пока оставил его в результатах, думая, что он может как-то помочь разобраться с этой неразберихой.

Мне интересно, должен ли я просто вернуться к человеку, который дал мне это, и сказать ему, что я сожалею, но я ничего не могу с этим поделать, так как он так испорчен. Если вы считаете, что можно исправить эти результаты опроса, дайте мне несколько советов (подробно, у меня нет большого опыта работы с VB Script).

Любые другие комментарии, мысли или предложения также приветствуются.


person ubiquibacon    schedule 11.01.2011    source источник
comment
Это не лажа, это довольно стандартный подход к опросу. Было бы очень легко проанализировать в базе данных, или вы можете использовать SQL в Excel. Какой подход вы представляете?   -  person Fionnuala    schedule 11.01.2011
comment
@Remou У меня гораздо больше опыта в SQL, чем в VB Script (MySQL). Я хотел бы оставить его в Excel (и использовать SQL, как вы предложили), если это возможно, но если вы думаете, что сначала будет проще поместить его в базу данных, я пойду по этому пути.   -  person ubiquibacon    schedule 11.01.2011
comment
Хорошо, я вернусь к вам, если кто-то еще меня не опередит :)   -  person Fionnuala    schedule 11.01.2011
comment
@Remou спасибо! Пока попробую поработать с этим в базе данных Access... Может повезет!   -  person ubiquibacon    schedule 11.01.2011


Ответы (3)


У меня есть многолетний опыт работы с VBA в Excel и Access 2003 и 2010, и я могу сказать вам, что это было бы неинтересно обрабатывать в Excel; основываясь на структуре результатов опроса, я настоятельно рекомендую импортировать их в Access (если он у вас есть) и запускать SQL-запросы для нарезки данных. Он действительно в формате таблицы базы данных, у него даже есть первичный ключ (ID).

person Community    schedule 11.01.2011
comment
Все было бы не так уж и плохо. Вы можете без особого труда использовать соединение Jet, ADO и SQL в Excel. - person Fionnuala; 11.01.2011
comment
Что ж, это было бы не так уж плохо, но я полагаю, что в Access он мог бы написать несколько быстрых SQL-запросов и/или создать хороший отчет об опросе. - person ; 11.01.2011
comment
Я импортировал это в базу данных Access, и я посмотрю, что я могу сделать. - person ubiquibacon; 12.01.2011

Я бы импортировал это в базу данных, а затем использовал простой запрос или два, чтобы сгенерировать то, что вы хотите.

person µBio    schedule 11.01.2011

Вот начало в Excel VBA, в Access это довольно простой запрос.

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

Это основано на наличии таблицы на листе2, например:

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
<...>
person Fionnuala    schedule 11.01.2011
comment
Я ценю все ваши усилия, но после того, как вы импортировали результаты опроса в Access, я думаю, что после нескольких запросов все будет улажено. Я в основном имел дело с MySQL, поэтому я немного не знаком с синтаксисом SQL Server, используемым в Access, но я работаю над ним. - person ubiquibacon; 12.01.2011
comment
Ну, как я уже сказал, это стандартный формат базы данных. Вы можете взять приведенный выше оператор sql, он будет работать в Access с очень небольшими изменениями, просто обязательно добавьте таблицу вопросов, как показано выше, и используйте имена таблиц вместо имен листов. - person Fionnuala; 12.01.2011