Можно ли отсортировать таблицу по дате изменения записи? В частности, как получить доступ из VBA к последнему времени модификации объекта?

3831
მამუკა ჯიბლაძე

У меня есть документ MS Word, где я накапливаю и часто изменяю определенные данные в очень длинной таблице. Поэтому я хотел бы отсортировать данные по времени последней модификации в строках. Конечно, если я добавлю столбец, в который я вручную ввожу время изменения, это будет работать, но я бы хотел избежать этого, если это возможно.

Хорошо, поскольку вопрос был отложен с просьбой сделать его более конкретным, я пытаюсь изменить его соответствующим образом.

Что я конкретно хочу (и тогда я могу сделать это сам) это:

Поскольку MS Word имеет такие функции, как отслеживание изменений, каждая измененная часть текста должна иметь свое время последнего изменения, записанное в той или иной форме.

Мой вопрос тогда - как я могу получить доступ к этой информации из макроса Visual Basic? Я имею в виду что-то вроде ThisTable.ThisCell.ModificationTime () или ThatTable.CurrentRow.LastModificationSessionTime () или что-то подобное.

2
Итак, когда вы изменяете элемент, вы хотите, чтобы он переместился в верхнюю часть таблицы? Или вы хотите, чтобы это было сделано исторически? Raystafarian 9 лет назад 0
@Raystafarian Я хотел бы отсортировать его по-разному, в том числе этот მამუკა ჯიბლაძე 9 лет назад 0
Если вы не отметите время записи, что вы планируете использовать для сортировки? AFAIK, таблицы не записывают автоматически при вводе каждого значения. fixer1234 9 лет назад 0
@ fixer1234 Word имеет функцию отслеживания изменений (на вкладке «Обзор»), поэтому он определенно где-то записан. В любом случае, приведенное ниже решение Excel (с автоматической отметкой времени) подойдет мне, за исключением того, что оно предназначено для одного столбца данных, а у меня их несколько. მამუკა ჯიბლაძე 9 лет назад 0
Я считаю, что отслеживание изменений работает на уровне сеанса. Таким образом, за один раз вы входите и создаете или модифицируете ряд строк, а затем сохраняете результат. Все эти записи будут частью одного и того же изменения. У вас не будет основы для сортировки по времени в наборе. fixer1234 9 лет назад 0
@ fixer1234 При просмотре ревизий я вижу отдельные времена модификации ревизий каждого куска текста, и это нормально для меня - если я могу отсортировать по самому последнему сеансу, в котором была изменена строка, это все, что я хочу მამუკა ჯიბლაძე 9 лет назад 0

1 ответ на вопрос

2
Gary's Student

This is for an Excel worksheet. Data is entered or modified in column A. The macro automatically enters the date/time in column B. The macro then sorts column A & B by column B, putting the most recent at the top.

Enter the following event macro in the worksheet code area:

Private Sub Worksheet_Change(ByVal Target As Range) Dim A As Range Dim AB As Range Set A = Range("A:A") Set AB = Range("A:B") If Intersect(Target, A) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub Application.EnableEvents = False Target.Offset(0, 1) = Now AB.Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal Application.EnableEvents = True End Sub 

Because it is worksheet code, it is very easy to install and automatic to use:

  1. right-click the tab name near the bottom of the Excel window
  2. select View Code - this brings up a VBE window
  3. paste the stuff in and close the VBE window

If you have any concerns, first try it on a trial worksheet.

If you save the workbook, the macro will be saved with it. If you are using a version of Excel later then 2003, you must save the file as .xlsm rather than .xlsx

To remove the macro:

  1. bring up the VBE windows as above
  2. clear the code out
  3. close the VBE window

To learn more about macros in general, see:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

and

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

To learn more about Event Macros (worksheet code), see:

http://www.mvps.org/dmcritchie/excel/event.htm

Macros must be enabled for this to work!

Это замечательно! И все так просто - мне даже не нужен фрагмент кода от `AB.Sort` до` ... = xlSortNormal`, так как я предпочитаю сортировать его по времени модификации не сразу, а только при необходимости. Единственная проблема, которую я не могу решить, заключается в следующем: если у меня есть несколько столбцов, и я хочу реагировать на изменения в любом из них, как изменить код? Конечно, я могу заменить A, скажем, AE, а B на F, но что делать с частью `Target.Offset (0,1)`? მამუკა ჯიბლაძე 9 лет назад 0