VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Ответить
Аватара пользователя
subuday77

VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение subuday77 »

Здравствуйте.



Есть рабочий скрипт.





Код:

Код: Выделить всё

Sub Unmerge()
'
' Unmerge Macro
'
'
   Dim rowCount As Long
          For rowCount = 2 To 2200
          ActiveSheet.Range("A" & rowCount).Select
            With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
              Selection.Unmerge
        Next rowCount
For rowCount = 2 To 2200
          ActiveSheet.Range("B" & rowCount).Select
            With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
    Selection.Unmerge
    Next rowCount
    ActiveSheet.Range("$A$1:$B$2171").AutoFilter Field:=1, Criteria1:="="
    Rows("3:2171").Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$B$1086").AutoFilter Field:=1
    Range("D1").Select
    End Sub

Хотелось бы вместо двух проходов (сперва столбец А, потом столбец В) делать один.

К сожалению, не смог разобраться, как это прописать.

На

Код:

Код: Выделить всё

 ActiveSheet.Range("A" & rowCount: "В" & rowCount).Select

и всяческие вариации на эту тему ругается компилятор.

Что я делаю не так? Изображение
Аватара пользователя
Iska

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение Iska »

Цитата subuday77:



Есть рабочий скрипт.
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




Ужас-ужас-ужас. Надо раз и навсегда забыть про .Select() (потому обязательно корректировать код после макрорекордера).




Цитата subuday77:



Что я делаю не так?
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




Вы делаете «не так» следующее:не даёте описание задачи;не даёте описание того, что делает (или что должен был бы делать) код;не упаковываете в архив образец Рабочей книги, для которой предназначен выложенный код, и не прикладываете его к сообщению.

Я вот смотрю на код и думаю — что он, собственно, делает и зачем? Вам действительно нужно всё вот это:



Код:

Код: Выделить всё

        With Selection
            .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlCenter
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = True
        End With
        Selection.Unmerge

или это — как было в макрорекордере записано, так и осталось?! Зачем нужно сначала .MergeCells = True и тут же — .Unmerge()?! Не нравится мне и жёстко привязанная адресация вида .Range("$A$1:$B$2171"), .Range("$A$1:$B$1086"). Впрочем, дело Ваше.



Убрал ненужный .Select(), остальное оставил как было.



Код:

Код: Выделить всё

Option Explicit
Sub Unmerge()
    Dim iRowCount As Long
    Dim iColumnCount As Long
    For iColumnCount = 1 To 2
        For iRowCount = 2 To 2200
            With ActiveSheet.Cells.Cells(iRowCount, iColumnCount)
                .HorizontalAlignment = xlGeneral
                .VerticalAlignment = xlCenter
                .WrapText = True
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = True
                .Unmerge
            End With
        Next iRowCount
    Next iColumnCount
    ActiveSheet.Range("$A$1:$B$2171").AutoFilter Field:=1, Criteria1:="="
    Rows("3:2171").Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$B$1086").AutoFilter Field:=1
    Range("D1").Select
End Sub
Аватара пользователя
Iska

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение Iska »

subuday77, я серьёзно спрашиваю по поводу:


Цитата Iska:



что он, собственно, делает и зачем? Вам действительно нужно всё вот это:
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




ибо, если окажется, что Вам действительно нужно только рассплитить ячейки, то всё укладывается в одну строку:



Код:

Код: Выделить всё

    With ActiveSheet
        .Range(.Cells.Cells(2, 1), .Cells.Cells(2200, 2)).Unmerge
    End With

вместо перебора кучи ячеек диапазона по одной.
Аватара пользователя
subuday77

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение subuday77 »

Спасибо.

Про Select() я в курсе. Но грешен. Я ещё и goto в батниках использую.

Но в целом, да, как записал, так и работает. Ну, почти. В напрямую записанном виде он не работал, по причине превышения 64 битного размера. Изображение

Пришлось слегка допилить.

Ваш способ очень хорош, более того, позволяет более гибко обработать лист.

Но в нём всё равно 2 прохода по листу.



И всё таки, можно как-то скомбинировать буквы и переменные?

Допустим, даже без Select.



Код:

Код: Выделить всё

 For iRowCount = 2 To 2200
            With ActiveSheet.Cells.Cells("A" & iRowCount : "B" & iRowCount)
           .MergeCells = false
 End With
        Next iRowCount

Вот такое что-нибудь?




Цитата:



With ActiveSheet

.Range(.Cells.Cells(2, 1), .Cells.Cells(2200, 2)).Unmerge

End With



А что так можно было?!



А он не угробит содержимое всех ячеек, кроме верхней?

UPD. Проверил. Нет, не угробит. Изображение
Вложения

[Расширение png было запрещено, вложение больше недоступно.]

Аватара пользователя
subuday77

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение subuday77 »

Цитата Iska:

что он, собственно, делает и зачем?
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.


Расскажу.

Некое существо, ещё более криворукое, чем я, собрало кучу эксель листов копипастом с сайта.

Всё ничего, но данные выглядят так:

http://forum.oszone.net/attachment.p...1&d=1535471448


Их очень много.

И чтобы привести всё это в божеский вид, пришлось срочно осваивать VBS.

Часа за два сваял что-то, что разцепляет ячейки, не удаляя при этом содержимое, а потом сносит пустые строки.

Как-то так.
Аватара пользователя
Iska

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение Iska »

Цитата subuday77:



Я ещё и goto в батниках использую.
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




Ну, тут, как бы, никуда не деться.




Цитата subuday77:



И всё таки, можно как-то скомбинировать буквы и переменные?
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




Комбинировать можно, только не буквы, а диапазоны (например, по объединять по Union() (
Application.Union Method (Excel) | Microsoft Docs
) или брать пересечение по .Intersect() (
Application.Intersect Method (Excel) | Microsoft Docs
)). Но мы можеи просто взять диапазон зараз:



Код:

Код: Выделить всё

    With ActiveSheet
        .Range(.Cells.Cells(2, 1), .Cells.Cells(2200, 2)).Unmerge
    End With

указывая в методе .Range() левую верхнюю ячейку и правую нижнюю ячейку диапазона. Причём, поскольку в методе .Range() требуется указание объектов типа Range, мы можем вместо метода .Cells() и цифр строки и столбца использовать буквенно-цифоровую адресацию, например:



Код:

Код: Выделить всё

    With ActiveSheet
        .Range(.Range("A2"), .Range("B2200")).Unmerge
    End With


Цитата subuday77:



А что так можно было?!
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




Конечно. Я потому и пишу, что обычно требуется сделать:



Скрытый текст

[spoiler]Цитата Iska:[/spoiler]



Вы делаете «не так» следующее:не даёте описание задачи;не даёте описание того, что делает (или что должен был бы делать) код;не упаковываете в архив образец Рабочей книги, для которой предназначен выложенный код, и не прикладываете его к сообщению.
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.








потому как задача[/i] может быть решена совсем другим способом, может не нуждаться в выбранном решении и т.п.




Цитата subuday77:



А он не угробит содержимое всех ячеек, кроме верхней?
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




А как? Это при объединении теряются значения всех объединённых ячеек, кроме самой верхней левой, но мы же тут разъединяем их, а не объединяем.




Цитата subuday77:



Расскажу.

Некое существо, ещё более криворукое, чем я, собрало кучу эксель листов копипастом с сайта.

Всё ничего, но данные выглядят так:

http://forum.oszone.net/attachment.p...1&d=1535471448


Их очень много.

И чтобы привести всё это в божеский вид, пришлось срочно осваивать VBS.

Часа за два сваял что-то, что разцепляет ячейки, не удаляя при этом содержимое, а потом сносит пустые строки.

Как-то так.
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




subuday77, спасибо, ясно. Ну, тогда, значится, для однократного применения и Ваш код более чем гож, даже с прямым указанием адресации (разве что отрабатывать будет достаточно долго).
Аватара пользователя
Iska

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение Iska »

Цитата subuday77:



а потом сносит пустые строки.
VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




То есть, вот этот код у Вас:


Цитата subuday77:





Код:

Код: Выделить всё

    ActiveSheet.Range("$A$1:$B$2171").AutoFilter Field:=1, Criteria1:="="
    Rows("3:2171").Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$B$1086").AutoFilter Field:=1
    Range("D1").Select

VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.




предназначен для удаления пустых строк?
Аватара пользователя
subuday77

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение subuday77 »

Вот, привёл вот к такому виду:



Код:

Код: Выделить всё

Sub Unmerge()
'
' Unmerge Macro
'
'
  With ActiveSheet
    .Range("$A$2:$B$2200").Unmerge
    .Range("$A:$B").AutoFilter Field:=1, Criteria1:="="
     Rows("2:2200").Select
     Selection.Delete Shift:=xlUp
    .Range("$A:$B").AutoFilter Field:=1
    .Range("D1").Select
  End With
End Sub

Всё работает.

Ещё раз спасибо! Изображение
Аватара пользователя
Iska

Re: VBS/WSH/JS - [решено] Выбор нескольких ячеек экселя с помощью переменной в макросе.

Сообщение Iska »

subuday77, удалить можно ещё так:



Код:

Код: Выделить всё

    Dim objRange As Variant
    …
    For Each objRange In ActiveSheet.Range("A2:A2200").SpecialCells(xlCellTypeBlanks).EntireRow.Areas
        objRange.Delete
    Next objRange

Берём в диапазоне .Range("A2:A2200") все пустые ячейки, берём целые строки от них, перебираем и удаляем каждую из отдельных областей полученного диапазона.



Почему именно .Range("A2:A2200"), а не .Range("A2:B2200")? Потому что Вы фильтруете по Field == 1.
Ответить

Вернуться в «Программирование и базы данных»