Делать Пока цикл перебирает лист до конца, никогда не совпадает при условии - PullRequest
0 голосов
/ 09 января 2019

У меня есть пользовательская форма, в которой пользователи вводят данные в ячейки, которые затем сортируются в электронную таблицу Excel «Основная».

Если пользователю необходимо удалить запись, он перемещается до тех пор, пока нарушающая запись не окажется на самой левой стороне пользовательской формы, и нажимает кнопку «Удалить», появляется окно с опцией, спрашивающее, хотят ли они удалить «да» или «нет». , Если они нажимают «да», пользовательская форма должна очистить ячейки поврежденных данных, в то время как в электронной таблице «Main» она переходит строка за строкой и сопоставляет значение из «Auth1» с его аналогом где-то в столбце «A», удаляя его.

Ничего не происходит. Вставляя перерывы и проходя через код и программу, у меня есть цикл Do While, который выполняется до тех пор, пока не заканчивается проверка ячеек, а затем переходит к остальной части кода.

Он взорвался прямо мимо соответствующей ячейки, которая больше не делала условие «истинным».

Фрагмент кода, о котором идет речь:

    Do While UMAuthorization!Auth1 <> ActiveCell
        ActiveCell.Offset(1, 0).Activate
    Loop

Подводная лодка «Да» всего

 Private Sub DeleteYes_Click()
   DeleteForm.Hide
   CloseBook
   OpenMinimized
   Range("A2").Select
   Sheets("Main").Unprotect
       Do While UMAuthorization!Auth1 <> ActiveCell
          ActiveCell.Offset(1, 0).Activate
       Loop
   ActiveCell.EntireRow.Delete Shift:=xlUp
   Sheets("Main").Protect
SaveBook
   Range("A2").Select
    If Auth2 <> "" Then
        Do While UMAuthorization!Auth2 <> ActiveCell
            ActiveCell.Offset(1, 0).Activate
        Loop
    Else
        Do While UMAuthorization!Claim1 > ActiveCell And ActiveCell <> ""
            ActiveCell.Offset(1, 0).Activate
        Loop
    End If
End Sub

Мы только что обновились до 2016 Excel. Этот код прекрасно работает в 2010 году. Для меня это имеет смысл. Тем не менее, Excel 2016 не признает это. Я проверил ссылки и возился со значениями, но я в тупике. Мысли кто-нибудь?

Редактировать: Вот некоторые бессмысленные примеры данных. Auth - столбец A. Строка 1 - статический заголовок.

1 Auth    Claim  TaxID    Type   AuthDate   
2 0033087 154255 270275455    PT     08/25/18
3 0094525 155512 545465646    PT     12/12/18
4 0025125 555555 565445546    Acu    11/15/12
5 9994313 354585 564645545    X      01/08/18
6 5464654 111551 688558585    Chiro  09/15/09 
7 9954545 445664 545665456    OT     05/30/15

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Возможно, это связано с тем, как Excel интерпретирует ваши данные. Я вижу, у вас есть ряд "заголовков" нулей в вашем образце данных.

Свойством объекта по умолчанию для объекта Range, такого как ActiveCell, является .value. Я бы попробовал изменить ActiveCell на ActiveCell.value2. Для получения информации о различиях см. Этот связанный пост: В чем разница между .text, .value и .value2?

Do While UMAuthorization!Auth1 <> ActiveCell.value2
    ActiveCell.Offset(1, 0).Activate
Loop

Другим примером может быть запуск cLng () для преобразования обеих переменных в число, в котором «заголовочные» нули будут «обрезаны».

Do While cLng(UMAuthorization!Auth1) <> cLng(ActiveCell)
    ActiveCell.Offset(1, 0).Activate
Loop

В качестве альтернативы вы можете заставить нули появляться, если код имеет менее 7 цифр:

Do While format(UMAuthorization!Auth1, "0000000") <> format(ActiveCell, "0000000")
    ActiveCell.Offset(1, 0).Activate
Loop

Дайте нам знать, работает ли Цикл вечно?

В целом, я бы рекомендовал избегать использования объектов .activate и ActiveCell для прокрутки ваших данных, поскольку это медленный и рискованный процесс, если пользователь щелкает где-то на листе во время выполнения цикла. Вы можете эффективно извлечь ваши данные в массив, обработать ваш массив данных в VBA для определения соответствующих строк и затем обработать лист: (Обратите внимание, что это также позволит вам увидеть, как Excel читает ваши данные, создавая файл debug.print для данных, хранящихся в массиве) *

Dim mySheet as new worksheet
set mySheet = ActiveSheet 'Or something else

Dim arrMyData() as variant 'Must be a variant
arrMyData = range("A2:A999").Value2 'Adjust A999 with your case

dim i as long
for i = lBound(arrMyData,1) to uBound(arrMyData,1)
    debug.print "Comparing " & arrMyData(i,1) & " with " & UMAuthorization!Auth1
    if arrMyData(i,1) = UMAuthorization!Auth1 then
    'if cLng(arrMyData(i,1)) = cLng(UMAuthorization!Auth1) then  <- Use this line if the one aboe does not work
        mySheet.Rows(i+1).delete Shift:=xlUp 'i+1 Because i=1 because your array starts at Row 2 (Cell A2)
        Debug.Print "Deleted row " & i+1
    end if
Next
0 голосов
/ 09 января 2019

Вы должны заменить код между

Sheets("Main").Unprotect

и

Sheets("Main").protect

С этим

With Worksheets("Main").Range("A:A")
    Set c = .Find(UMAuthorization!Auth1, LookIn:=xlValues)
    If Not c Is Nothing Then
        Do
            c.EntireRow.Delete Shift:=xlUp
            Set c = .Find(UMAuthorization!Auth1, LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With

Он найдет значение из вашей формы и удалит все строки, которые соответствуют столбцу A.

Вы можете ограничить диапазон, изменив столбец A на некоторый диапазон, например A2: A200.

Если вы хотите удалить только первое совпадение, удалите цикл do, но оставьте строку удаления.

Поскольку у меня нет вашей формы, я проверил это со статическим значением.

...