#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 из приведенного выше кодового блока:
- $A$1:$N$11
- $O $1:$ XFD $ 1
- $ A $11: $ A $ 1048576
- $A$1:$N$11
Я ожидаю следующих результатов Msgbox из приведенного выше кодового блока:
- $A$1:$N$11
- $O $1:$ XFD $ 1
- $ A $11: $ A $ 1048576
- $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