Если исходное значение базовой ячейки не важно, то есть несколько способов, которыми вы можете показать пользователю done в ячейке, в то время как фактическое значение ячейки равно zdone .Первым на ум приходит условное форматирование.
Альтернативно, временный столбец 'помощника' может быть вставлен, заполнен, использован в качестве первичного ключа для сортировки, а затем удален, прежде чем управление будет возвращено пользователю.
Массив данных может быть собран, а затем пользовательским образом отсортирован в памяти в соответствии с любыми условиями, которые вы кодируете перед возвратом отсортированных данных обратно на лист.
Кстати, неясно, каксортировка по zdone работает должным образом, если задействованы пустые ячейки.Пустые ячейки должны быть помещены ниже zdone в порядке возрастания, чтобы ваши строки zdone не находились внизу списка.
Вот основанный на массиверешение, позволяющее создать любой пользовательский алгоритм сортировки, который вы можете себе представить.
Option Explicit
Sub CustomDoneArraySort()
Dim i As Long, j As Long, k As Long, arr As Variant, tmp As Variant
With Worksheets("sheet4")
'collect data from worksheet excluding header
arr = .Range(.Cells(4, "A"), .Cells(.Rows.Count, "C").End(xlUp)).Value
'expand array to allow a 'helper column' in the second rank
ReDim Preserve arr(LBound(arr, 1) To UBound(arr, 1), _
LBound(arr, 2) To UBound(arr, 2) + 1)
'populate helper column
'this can be as complicated as you want but it
'will ultimately determine the finished sort order
'this version will create a column where blanks are 'zz'
'and 'done' is 'zzz' and other text is unchanged
For i = LBound(arr, 1) To UBound(arr, 1)
Select Case arr(i, 2)
Case "done", "Done", "DONE"
arr(i, UBound(arr, 2)) = "zzz"
Case vbNullString
arr(i, UBound(arr, 2)) = "zz"
Case Else
arr(i, UBound(arr, 2)) = arr(i, 2)
End Select
Next i
'create a temporary array to use for shifting values
ReDim tmp(LBound(arr, 2) To UBound(arr, 2))
'sort on the 'helper column'
For i = LBound(arr, 1) To UBound(arr, 1) - 1
For j = i To UBound(arr, 1)
'xlAscending sort
If arr(i, UBound(arr, 2)) > arr(j, UBound(arr, 2)) Then
'store the values from the sorting shift target in tmp
For k = LBound(tmp) To UBound(tmp)
tmp(k) = arr(j, k)
Next k
'transfer the values from the sorting shift source to the sorting shift target
For k = LBound(tmp) To UBound(tmp)
arr(j, k) = arr(i, k)
Next k
'put the tmp values in the sorting shift source
For k = LBound(tmp) To UBound(tmp)
arr(i, k) = tmp(k)
Next k
End If
Next j
Next i
'remove the array's 'helper column' in the second rank
ReDim Preserve arr(LBound(arr, 1) To UBound(arr, 1), _
LBound(arr, 2) To UBound(arr, 2) - 1)
'return sorted array to worksheet
.Cells(4, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End With
End Sub
![enter image description here](https://i.stack.imgur.com/ktrfA.png)