2015-07-25 3 views
0

Я пытаюсь написать макрос для автоматической сортировки таблицы в Excel при изменении любого значения в таблице.
Это мой код VBAКак запустить макрос Excel VBA непрерывно?

Sub Macro3(ByVal target As Range) 
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Add _ 
     Key:=Range("Table4[Pts]"), SortOn:=xlSortOnValues, Order:=xlDescending, _ 
     DataOption:=xlSortNormal 
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Add _ 
     Key:=Range("Table4[GD]"), SortOn:=xlSortOnValues, Order:=xlDescending, _ 
     DataOption:=xlSortNormal 
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Add _ 
     Key:=Range("Table4[GF]"), SortOn:=xlSortOnValues, Order:=xlDescending, _ 
     DataOption:=xlSortNormal 
    With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort 
     .Header = xlYes 
     .MatchCase = True 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
End Sub 

Sub sort() 
    Dim target As Range 
    Set target = Range("Table4") 
    Call Macro3(target) 
End Sub 

Что я должен сделать, чтобы этот макрос работает непрерывно каждый раз значение в изменении таблицы?

+1

Считаете ли вы это? Разве пользователь не будет сбивать с толку, если диаграмма будет сортироваться во время редактирования? Что будет с их текущей ячейкой? Они нажимают вкладку, поэтому ячейка изменилась. Это означает, что список отсортирован. Что вы будете делать с выбором? – Ben

+0

Ячейка изменяется из-за формул в других ячейках, ключевой момент таблицы - это сортировка, когда значения ячеек изменяются. – Mohamad

ответ

0

A Worksheet_Change Событие макроса не будет инициироваться, если значения ячейки изменены из-за изменения формулы ячейки из изменения на другом листе. Для этого вам нужно записать событие Worksheet_Calculate.

Это не код модуля. Он принадлежит кодовой странице Sheet1. Щелкните правой кнопкой мыши вкладку Sheet1 внизу вашей книги и выберите «Просмотреть код». Когда откроется VBE, вставьте следующее в панель под названием что-то вроде Book1 - Sheet1 (Code).

Private Sub Worksheet_Calculate() 
    On Error Goto bm_Safe_Exit 
    Application.EnableEvents = False 
    With ListObjects("Table4").Sort 
     With .SortFields 
      .Clear 
      .Add Key:=Range("Table4[[#All],[Pts]]"), Order:=xlDescending 
      .Add Key:=Range("Table4[[#All],[GD]]"), Order:=xlDescending 
      .Add Key:=Range("Table4[[#All],[GF]]"), Order:=xlDescending 
     End With 
     .Header = xlYes 
     .Apply 
    End With 
bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 

Нажмите Alt + Q, чтобы вернуться на рабочий лист. Если формулы пересчитываются, данные в Таблице 4 будут применены. Мониторинг событий временно приостанавливается, так что акт сортировки не вызывает другого события вычисления.

+0

Огромное спасибо, он отлично работал, как я хочу :) – Mohamad

0

Чтобы выполнить макрос каждый раз при изменении ячейки в таблице/диапазоне, вы можете использовать events, который вы вводите в код для листа.

В вашем случае, вы, вероятно, хотите что-то вроде:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, range_of_table) Is Nothing Then 
    Call sort 
    End If 
End Sub 

Где range_of_table является диапазон таблицы, которую вы создали.

+0

Каков синтаксис переменной «range_of_table»? У меня есть таблица с названием «Таблица4» Как я могу правильно ее записать в функции? – Mohamad

+0

Это должен быть объект диапазона, например. Диапазон («Таблица 4»), используемый в макросе Sort(), который вы использовали выше (хотя лично я бы квалифицировал, какой рабочий лист также включен). В основном вы говорите, что если «Target» -диапазон (диапазон, который был изменен, который вызвал событие) и другой диапазон, который вы квалифицируете либо в вызове функции, либо раньше в макросе, вы выполняете код внутри if- заявление. Также обратите внимание, что это относится к кодовому модулю листа, а не к регулярному кодовому модулю. – eirikdaude

+0

, когда я хочу запустить этот код, подпрограмма «sort» - это макрос, который отображается в списке макросов, а не «workheet_Change» , поэтому подпрограмма «workheet_change» ничего не меняет в макросе! – Mohamad

Смежные вопросы