Ваш код в настоящее время зависает, потому что, когда он перемещается в конец списка, X никогда не увеличивается, поэтому он переходит в бесконечное l oop. Я не тестировал код FaneDuru, так что это может быть ответ, но другим вариантом было бы добавить в ваш код какое-то предложение escape, которое оттолкнет вас в случае какого-то условия, которое вы не ожидаете когда-либо произойти естественным образом. в вашем коде - как счетчик if range ("b" & x) .value = "", который сбрасывается, когда не истинно, и при достижении некоторого максимального значения (скажем, 10 спина к пустым ячейкам) устанавливает X равным вашему максимальное значение (в данном случае 2000).
Не забывайте, что при наличии таких странных вещей, вы можете пошагово пройти свой код с помощью F8 и посмотреть свои значения X и Y в окне локальных переменных - если вы это сделаете, тот факт, что X застревает, становится очевидным.
счетчик выборок (не очень эффективен, но работает):
Sub Transpose_by_bold()
Dim x, y As Integer
Dim Counter as Integer
y = 1
For x = 1 To 2000
If IsEmpty(Range("B" & x + 1)) Then
Counter = Counter + 1
Else
Counter = 0
End If
If Counter > 9 Then
x = 2001
End If
If Range("B" & x).Font.Bold = True And Range("B" & x + 1).Font.Bold = True Then y = 1
If Range("B" & x).Font.Bold = True And Range("B" & x + 1).Font.Bold = False Then
Range("B" & x + 1).Cut Range("B" & x).Offset(0, y)
Range("B" & x + 1).EntireRow.Delete
y = y + 1
x = x - 1
End If
Next x
End Sub
Альтернативный вариант, я только что понял (редактирование, чтобы отметить это), было бы подсчитать максимально возможное количество строк через пересечение интересующего столбца и используемого диапазона листа, а затем сохранить счетчик, который просто проверяет, как много общих строк, которые вы оценили (ваш счетчик X прямо сейчас показывает, сколько строк вы получите, а не сколько вы просмотрели, из-за вашей строки x = x-1) и запустите свой основной For l oop на этом счетчике общего количества строк, а не на X.
Удачи!