Страницы: 1 2 След.
RSS
Выбор нескольких столбцов данных в "умной таблице" (ListObjects) средствами VBA
 
Здравствуйте, все!
Вопрос такой: есть на листе таблица "Table1", в VBA ей соответствует ListObjects("Table1").
В таблице есть несколько столбцов с именами "a", "b", "c".
Мне надо выбрать (для копирования) области данных нескольких смежных столбцов одновременно. Как это сделать???
Данные (без заголовка!) одного столбца выбираются элементарно:
Код
Dim r As Range
Set r=ThisWorkbook.Worksheets("Sheet1").ListObjects("Table1").ListColumns.Item("b").DataBodyRange
r.Copy

и т.д.....
А вот как выбрать данные сразу двух/трёх/ и т.д. столбцов этой "умной таблицы"???
 
Сделал на листочке простую "умную" таблицу с заголовками "Один", "Два", "Три"
Забил 3-4 строк данных
Включил макрорекордер
Выделил столбец "ОДИН", "ДВА"
Получил код:
Код
 Range("Таблица1[[#All],[Один]:[Два]]").Select

Может через это как-то попробовать?
Кому решение нужно - тот пример и рисует.
 
Ничего лучшего не придумал  :(. Union
Код
Dim r As Range
With Worksheets("Лист1").ListObjects("Таблица1")
    Set r = Union(.ListColumns("b").DataBodyRange, .ListColumns("c").DataBodyRange)
End With
r.Copy
Изменено: Sanja - 22.12.2016 13:10:48
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал: Union
Может быть и прокатит, но хочется верить, что создатели  VBA догадывались, что кому-нибудь может потребоваться выбрать более одного столбца и предусмотрели некий простой и удобный вариант. Только забыли его задокументировать. :(
 
Цитата
Range("Таблица1[[#All],[Один]:[Два]]").Select
чем не
Цитата
простой и удобный вариант
Изменено: Dima S - 22.12.2016 22:20:25
 
Мартын, может пригодится https://www.thespreadsheetguru.com/blog/2014/6/20/the-vba-guide-to-listobject-excel-tables
 
Цитата
Мартын написал: области данных нескольких смежных столбцов одновременно
Код
Set r = Worksheets("Лист1").ListObjects("Таблица1").DataBodyRange.Columns("b:c")
Согласие есть продукт при полном непротивлении сторон
 
Sanja, огромное спасибо!!! Я верил, что простой способ есть!
 
:D Просто попробовал расставить свойства объекта ListObjects("Таблица1") в той последовательности, которая требовалась
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Мартын написал:
Я верил, что простой способ есть!
Но не этот  :)
Код
Set r = Worksheets("Лист1").ListObjects("Таблица1").ListColumns("b").DataBodyRange

и
Код
Set r = Worksheets("Лист1").ListObjects("Таблица1").DataBodyRange.Columns("b")

дадут два совершенно различных диапазона (если только случайно второй столбец таблицы не имеет имя "b")
Код
Sub qq()
    With Worksheets("Лист1").ListObjects("Таблица1")
        Set r = .DataBodyRange.Offset(, .ListColumns("b").Index - 1) _
                .Resize(, .ListColumns("d").Index - .ListColumns("b").Index + 1)
    End With
    r.Select
End Sub
 
RAN, точно, промашка вышла. Названия столбцов действительно совпадали с их заголовками (#7)
Не понял для чего .Offset
Код
Sub ListO()
Dim r As Range
With Worksheets("Лист1").ListObjects("Таблица1")
'   Если известна величина смещения
'    Set r = .ListColumns("Clm2").DataBodyRange.Resize(, 3)
'   По названию столбца
    Set r = .ListColumns("Clm2").DataBodyRange. _
        Resize(, .ListColumns("Clm4").Index - .ListColumns("Clm2").Index + 1)
End With
    r.Select
'    r.Copy
End Sub
Изменено: Sanja - 24.12.2016 09:43:00
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал: Не понял для чего .Offset
Перемудрил
 
Для примера таблицы Андрея из сообщения #11
Код
' Выделить смежные столбцы DataBodyRange со 2-го по 4-й
Sub Столбцы234()
  Range("Таблица1[[Clm2]:[Clm4]]").Select
  ' или так:
  'Range("Таблица1[Clm2]").Resize(,3).Select
End Sub

' Выделить несмежные столбцы DataBodyRange 2-й и 4-й
Sub Столбцы24()
  Range("Таблица1[Clm2],Таблица1[Clm4]").Select
End Sub
Изменено: ZVI - 25.12.2016 04:48:28
 
Нашел простой ИМХО способ:
Dim r As Range
With ThisWorkbook.Worksheets("Sheet1").ListObjects("Table1")
Set r = Range(.ListColumns("clm2").DataBodyRange, .ListColumns("clm4").DataBodyRange)
r.copy
end with
 
Цитата
Пытливый написал:
Сделал на листочке простую "умную" таблицу с заголовками "Один", "Два", "Три"Забил 3-4 строк данныхВключил макрорекордерВыделил столбец "ОДИН", "ДВА"Получил код:Код ? 1Range("Таблица1[[#All],[Один]:[Два]]").SelectМожет через это как-то попробовать?

А как таким образом выделить столбец "Один", "Пять", "Восемь"??
 
нажмите Ctrl
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
нажмите Ctrl

Таким способом:
Код
Range("Таблица1[[#All],[Один]:[Два]]").Select


При выборе несмежных столбцов макрорекордер пишет обычный диапазон (не диапазон умной таблицы).
 
Цитата
написал:
При выборе несмежных столбцов
выше же дали способ - чем не подходит? Сообщение #13 от 25.12.2016 01:02:08
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
выше же дали способ - чем не подходит?

Столбцы "Один" и "Два" смежные:
Код
Range("Таблица1[[#All],[Один]:[Два]]").Select


Столбцы "Один", "Пять", "Восемь" - несмежные, а перечисление через запятую выдает ошибку:
Код
Range("Таблица1[[#All],[Один],[Пять],[Восемь]]").Select
 
Найдите разницу между #13:
Код
Range("Таблица1[Clm2],Таблица1[Clm4]")
и #19:
Код
Range("Таблица1[[#All],[Один],[Пять],[Восемь]]")
Владимир
 
sokol92, благодарю. Не обратил внимание.
 
Возможно ли соединить два таких диапазона в одном объекте Range:

Код
Sheet1.Range( _
"Таблица1[ОДИН]," + _
"Таблица1[ПЯТЬ]," + _
"Таблица1[ВОСЕМЬ]").Select


Код
Sheet1.Range("Таблица1").Columns(10).Select
Изменено: tchack - 19.12.2022 22:05:56
 
Код
Sub Test()
    Dim Sheet1 As Worksheet
    
    Set Sheet1 = ActiveSheet
    
    Sheet1.Range("Таблица1[Column2]").Select
    Sheet1.Range("Таблица1[Column1],Таблица1[Column5],Таблица1[Column8]").Select
    Sheet1.Range("Таблица1").Columns(10).Select
    
    Dim Rng1 As Range
    Dim Rng2 As Range
    Dim Rng3 As Range
    
    Set Rng1 = Sheet1.Range("Таблица1[Column1],Таблица1[Column5],Таблица1[Column8]")
    Set Rng2 = Sheet1.Range("Таблица1").Columns(10)
    
    Set Rng3 = Union(Rng1, Rng2)
    Rng3.Select
    
End Sub
 
New, спасибо, так лучше:

Код
    Application.Union(Sheet1.Range( _
       "Таблица1[ОДИН]," + _
       "Таблица1[ПЯТЬ]," + _
       "Таблица1[ВОСЕМЬ]" _
    ), Sheet1.Range("Таблица1").Columns(10)).Select

но я ищу вариант без Union (если это возможно).
Изменено: tchack - 19.12.2022 23:56:01
 
если честно, вы ищите костыли )
 
Цитата
написал:
я ищу вариант без Union
Вы бы еще написали зачем эти грабли вообще Вам нужны - может чего и придумалось бы. А пока выглядит как желание капризного ребенка - хочу и все :)
Без обид, но никто не понимает почему нельзя Union и почему не подходят другие предложенные варианты.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, во всех сообщениях спрашивается о возможности, а не о "желании капризного ребенка".

Логичный ответ был бы или "такая возможность отсутствует", или "такая возможность есть.....".

PS: Если бы покупая внедорожник, Вы бы поинтересовались о возможности проехать на нем через лес, а в ответ бы Вам сказали, что можно проехать по шоссе, а Ваш вопрос это желание капризного ребенка, то чтобы Вы ответили?
Изменено: tchack - 20.12.2022 10:43:23
 
Цитата
tchack написал:
Если бы покупая внедорожник, Вы бы поинтересовались о возможности проехать на нем через лес, а в ответ бы Вам сказали, что можно проехать по шоссе, а Ваш вопрос это желание капризного ребенка, то чтобы Вы ответили?
я бы ответил, что Вы сейчас фигню полную написали и с аллегориями у Вас явно проблемы. Вы не подумали о том, что лес лесу рознь? Если в лесу нет дорог - одни деревья и нет даже тропинки - какой нафиг внедорожник? Покупайте танк. А если надо через лес конкретный проехать и мне в салоне вместо дороги через лес показали нормальную дорогу - да я только спасибо им скажу, что не отправили напролом в лес.
Ну а тропинки через лес Вам показали хоть на внедорожнике, хоть на велосипеде, но Вы ищите какие-то другие. При этом чем не нравятся те, что показали - не ясно, кром того, что "ну не нравится так". Поэтому пример Ваш весьма некорректен. К тому же Вы тут не на рынке и не в салоне, чтобы с Вами кто-то любезничал и вокруг бегал, накидывая варианты просто потому, что Вам так хочется. Поясните что не так с предложенными вариантам и чем не подходят - тогда будет разговор и можно будет думать, как что-то обойти или сделать иначе.
Цитата
tchack написал:
Логичный ответ был бы или "такая возможность отсутствует", или "такая возможность есть.....".
Вам привели несколько вариантов - ни один не подошел. Логично на Вашем месте было бы пояснить почему не подходит. Но Вы не хотите - значит это именно желание/каприз, а не конкретная задача. Вот когда поясните как-то иначе, кроме "а как еще можно?", тогда может и появится еще какой-то вариант. Ибо решать задачу просто из разряда "накидайте мне разных вариантов" вряд ли кто захочет.
Научитесь читать то, что пишут, а не то, что хотите прочесть:
Цитата
Дмитрий(The_Prist) Щербаков написал:
никто не понимает почему нельзя Union и почему не подходят другие предложенные варианты.
Изменено: Дмитрий(The_Prist) Щербаков - 20.12.2022 11:10:03
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Подскажите, пожалуйста, почему не работает вариант:
Код
Debug.Print WorksheetFunction.CountBlank(Sheet1.Range("Таблица1[ОДИН],Таблица1[ПЯТЬ],Таблица1[ВОСЕМЬ]"))

но работает:
Код
Debug.Print WorksheetFunction.CountBlank(Sheet1.Range("O2:O7", "R2:R7"))
 
потому что у вас неверная запись при обращении к объектам
P.S. Поиск костылей продолжается )
Изменено: New - 11.01.2023 12:44:55
Страницы: 1 2 След.
Читают тему
Наверх