UsedRange — не удается устранить конечную пустую строку

#excel #vba

#excel #vba

Вопрос:

Принимаются ответы как на VBA, так и не на VBA.

Проблема

Я пытаюсь сохранить лист в формате .csv, используя ThisWorkbook.SaveAs Filename:=strFilePath, FileFormat:=xlCSV , но поскольку UsedRange он содержит завершающую пустую строку, я получаю нежелательную строку с запятыми в .csv.

Что я сделал непосредственно перед этим в коде

 rngAllDate.SpecialCells(xlCellTypeVisible).Copy ThisWorkbook.Worksheets(1).Cells(1, 1)
  

Это может быть полезно, если вы пытаетесь воссоздать проблему.

Что я пробовал

  • Удаление всех строк под моими данными
  • Использование инструмента «ластик» для удаления всего из всех строк под моими данными
  • Очистка форматов со всего моего рабочего листа, включая мои данные, на случай, если границы вызывали проблему
  • Используя следующий кодовый блок VBA:

 With ThisWorkbook.Worksheets(1)
    .UsedRange 'I'm told this recomputes the UsedRange
    MsgBox .UsedRange.Address

    Dim rngColumnsToDeleteAndClear As Range
    Set rngColumnsToDeleteAndClear = .Range(.Cells(1, WorksheetFunction.CountA(.Rows(1))   1), .Cells(1, .Columns.Count))
    MsgBox rngColumnsToDeleteAndClear.Address
    rngColumnsToDeleteAndClear.EntireColumn.Clear
    rngColumnsToDeleteAndClear.EntireColumn.Delete

    Dim rngRowsToDeleteAndClear As Range
    Set rngRowsToDeleteAndClear = .Range(.Cells(WorksheetFunction.CountA(.Columns(1))   1, 1), .Cells(.Rows.Count, 1))
    MsgBox rngRowsToDeleteAndClear.Address
    rngRowsToDeleteAndClear.EntireRow.Clear
    rngRowsToDeleteAndClear.EntireRow.Delete

    .UsedRange
    MsgBox .UsedRange.Address
End With
  

Я получаю следующие результаты Msgbox из приведенного выше кодового блока:

  1. $A$1:$N$11
  2. $O $1:$ XFD $ 1
  3. $ A $11: $ A $ 1048576
  4. $A$1:$N$11

Я ожидаю следующих результатов Msgbox из приведенного выше кодового блока:

  1. $A$1:$N$11
  2. $O $1:$ XFD $ 1
  3. $ A $11: $ A $ 1048576
  4. $A$1:$N$10

Что еще я могу попробовать?

Комментарии:

1. Разве вы не можете использовать фильтр и выбрать что-нибудь, кроме пустого, скопировать диапазон на новый лист и сохранить как CSV?

2. Каков результат других ваших вызовов MsgBox? Я не вижу никакой дополнительной строки в UsedRange

3. Ради вопроса, насколько согласован ваш диапазон? если вы знаете свое количество столбцов (посредством динамического определения последнего столбца) и вы знаете свою последнюю строку (посредством динамического определения последней строки), вы можете использовать указанный диапазон… ячейки (1,1).изменить размер (lr, lc).скопировать или что-то в этом роде

4. Вы выполняете сохранение CSV с использованием VBA? Если да, было бы полезно опубликовать это.

5. @TimWilliams Да, это так — я никогда раньше не использовал UsedRange, поскольку он мне никогда не нужен как средство поиска VBA, но именно так я понимаю VBA, чтобы знать, что сохранять. Вот моя строка сохранения: ThisWorkbook.SaveAs Filename:=strFilePath, FileFormat:=xlCSV

Ответ №1:

Недавно у меня возникла проблема с используемым диапазоном в электронной таблице, и я не смог удалить / очистить ячейки и сбросить используемый диапазон. Исправление, которое я нашел, заключалось в том, чтобы выбрать все неиспользуемые строки / столбцы, изменить их размер, теперь удалить ячейки, сохранить электронную таблицу, и boom используемый диапазон был сброшен… Может быть, это вам поможет?

Комментарии:

1. Только что попробовал это, к сожалению, у меня это не сработало, но я рад, что у вас это сработало, и спасибо, что предложили это! Иногда необъяснимые вещи действительно работают.

Ответ №2:

По какой-то причине форматирование фактического диапазона данных приводило к тому, что UsedRange включал пустую строку в конце. Для справки, я использовал толстую рамку вокруг диапазона данных.

После очистки форматов из диапазона данных также показалось, что пустая строка все еще включена в используемый диапазон, как я уже говорил, я тестировал выше, потому что, когда я нажал Ctrl-Shift-End, выделенная область все еще включала пустую строку. Однако VBA показывает, что фактический используемый диапазон фактически сократился до строки 10 из строки 11.

Ответ №3:

попробуйте запустить это, чтобы увидеть, есть ли какие-либо скрытые разрывы в строке 11 прямо перед вычислением этого используемого диапазона

 Sub IterateCharacters()
    For Each cell In Sheets("Sheet1").Range(Cells(11, 1), Cells(11, 14))
        With cell
            For n = 1 To Len(.Value)
                Debug.Print Asc(Mid(.Value, n, 1))
            Next n
        End With
    Next
End Sub
  

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

 ActiveSheet.Range(Cells(11, 1), Cells(11, 14)).Replace "*", vbNullString