Итак, у меня есть таблица, полная данных, которая выглядит так:

          Subject A   Subject B   Subject C   Subject D   Count
Person A     F           F                       F          3
Person B     F           F           F                      3
Person C                             F           F          2
Count        2           2           2           2

И для каждого человека мне нужно распечатать для них записку, которая выглядит примерно так.

Person A
Subject A
Subject B
Subject D

Person B
Subject A
Subject B
Subject C

Person C
Subject C
Subject D

Таким образом, он должен быть вертикальным, а не горизонтальным. Есть около 930 студентов и 17 предметов. Кроме того, есть 4 столбца для класса, идентификатора, имени и номера каждого учащегося.

Можно ли сделать это только с помощью функций Excel или VBA должна быть реализована?

Я также могу написать приложение Visual Basic, возможно ли использовать Visual Basic для чтения данных и создания файла Excel в результате?

Если нужно использовать функцию excelm, скажите, пожалуйста, какую функцию использовать. Если VBA будет использоваться, пожалуйста, сообщите мне руководство или функцию для подражания. Если VB будет использоваться, пожалуйста, сообщите мне используемые API.

РЕДАКТИРОВАТЬ: Поскольку мне нужно несколько небольших заметок, как насчет Mail Merge с Word? Это выполнимо?

1 ответ1

1

Мне было скучно, поэтому я сделал быстрый пример, чтобы показать вам, как начать.

  • Скачать и открыть пример
  • нажмите Alt+F8 и запустите макрос
  • посмотрите на лист 2

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

Sub makenotes()
Sheets(2).ResetAllPageBreaks    'if there are some old page breaks, we delete them first

Dim subjects()  'create an empty array
subjects() = Array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)   'which columns are subjects?

For irow = 2 To 34      'how many students (rows) should I loop through?
For icolumn = 1 To 19       'and per line: how many subjects & personal (columns) should I loop through?

ivalue = Sheets(1).Cells(irow, icolumn)     'save our cell value. we need it multiple times
if Not ivalue = vbNullString Then       'first we look if the cell has a value to print
    icount = icount + 1         'oh, we found something! lets increase our line counter (start is 0+1)

    On Error Resume Next    'the following match method will produce an error, if nothing will be found. We have to handle it.
    subjectcolumn = Application.Match(icolumn, subjects, 0)   'are we in a subject's column? not? ok give me the error
    On Error GoTo 0    'this turns off our error handle and everything is like before

    If IsError(subjectcolumn) Then       ' if we are not in a subject's column ...
        Sheets(2).Cells(icount, 1) = Sheets(1).Cells(irow, icolumn)  'then just write the normal cell value
    Else
        Sheets(2).Cells(icount, 1) = Sheets(1).Cells(1, icolumn)    'else write the header of that column
    End If
End If

Next icolumn      'we are finished with this column. Go back and start with the next column
Sheets(2).Rows(icount + 1).PageBreak = xlPageBreakManual     'ok, we are finished with that student. Lets insert a page break

Next irow  'and go back and start with the next student
Sheets(2).Columns(1).HorizontalAlignment = xlLeft   'add more formating commands. record them with the macro recorder
End Sub   


Нажмите, чтобы увеличить скриншот

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .