AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.12.2008, 10:56   #1  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Выделить несколько диапазонов одновременно (в Excel)
Народ подскажите. Надо выделить в Excel программно несколько строк, но не подряд, а с разрывами – типа зажав ctrl.

Записав макрос в Excel получил такой код

Range("7:10,13:16").Select

В Ax пишу

COM toRange = activeSheet.Range(“7:10,13:16”);

Вываливается с ошибкой (неизвестно)

Хотя activeSheet.Range(«7:10»); - прокатывает

Как по-другому выделить несколько диапазонов?
Старый 17.12.2008, 11:01   #2  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Попробуй для разделения диапазонов вместо запятой указать точку с запятой. Как вариант, вместо строки передавать вариантный массив. Если найду пример передачи из Аксы, выложу (в свое время в 1С выкручивались именно с вариантным массивом, насчет аксы не помню, есть ли пример).
За это сообщение автора поблагодарили: Alenka (1).
Старый 17.12.2008, 11:14   #3  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Точка с запятой не прокатила..
Старый 17.12.2008, 11:18   #4  
zZ_TOP_Zz is offline
zZ_TOP_Zz
int 20h
Аватар для zZ_TOP_Zz
 
143 / 24 (1) +++
Регистрация: 26.02.2007
Адрес: Санкт -Петербург
Добрый день, попробуйте почитать вот этот пост Еще проблема с Excel при построении диаграмм

может натолкнёт на мысли
__________________
It's just my Unhopelessnessabilityerism
Trying to debug my mind
Старый 17.12.2008, 12:01   #5  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от MironovI Посмотреть сообщение
Точка с запятой не прокатила..
А какой символ у вас стоит в качестве list separator в Regional and Lanquage Option?
Что возвращает этот код:
X++:
static void jbCheckListSeparator(Args _args)
{
    #WinAPI
    #define.LOCALE_SLIST( 0x0000000C )
    ;
    
    info( WinAPI::getLocaleInfo( #LOCALE_SYSTEM_DEFAULT, #LOCALE_SLIST ) ) ;
}
За это сообщение автора поблагодарили: MironovI (2).
Старый 17.12.2008, 12:05   #6  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Точка с запятой.. Я и ее и запятую пробовал.. Должно работать думаете?
Старый 17.12.2008, 12:08   #7  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Вай шайтан, заработало, точка с запято, почему-то не с первого раза, видимо поняла что упираться безсмыслено, всем спасибо!
Старый 17.12.2008, 12:16   #8  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от MironovI Посмотреть сообщение
Вай шайтан, заработало, точка с запято, почему-то не с первого раза, видимо поняла что упираться безсмыслено, всем спасибо!
Все же рекомендовал бы не ориентироваться на символ ";" в коде, а считывать его предварительно ( через WinAPI::getLocaleInfo( #LOCALE_SYSTEM_DEFAULT, #LOCALE_SLIST ) или .NET ) из настроек Windows.
Иначе можете получить код, который не будет работать на тех ПК настройки которых отличны от ";".
Старый 17.12.2008, 12:31   #9  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Да, эт я понял.
PS Я понял почму у меня не работало - корректно работает тольо с короткими строками, насколько кроткими не проверял, но вот на такой уже сыпется

"6:10;12:16;18:22;24:28;30:34;36:40;42:46;48:52;54:58;60:64;66:70;72:76;78:82;84:88;90:94;96:100;102:106;108:112;114:118;120:124;126:130;132:136;138:142;144:148;150:154;156:160;162:166;168:172;174:178;180:184;186:190;192:196;198:202;204:208;210:214;216:220;222:226;228:232;234:238;240:244"

а щассе было так возможно.. придется дробить видимо..
Старый 17.12.2008, 12:40   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Дозвольте со своим пятаком влезть. Существует более человеческий способ объединения диапазонов - методом Union объекта Excel.Application. Его выгодное преимущество - он не зависит от капризов региональных настроек:
X++:
static void Job120(Args _args)
{
    ComExcelDocument_RU doc = new ComExcelDocument_RU();

    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    COM     range;
    ;

    doc.NewFile();
    wbook = doc.getComDocument();

    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();

    range = activeSheet.Range('7:10');
    range = xlApp.Union(range, activeSheet.Range('13:16'));
    range = xlApp.Union(range, activeSheet.Range('23:26'));
    range = xlApp.Union(range, activeSheet.Range('33:36'));

    range.Select();
}
Старый 17.12.2008, 13:00   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от MironovI Посмотреть сообщение
корректно работает тольо с короткими строками, насколько кроткими не проверял, но вот на такой уже сыпется

"6:10;12:16;18:22;24:28;30:34;36:40;42:46;48:52;54:58;60:64;66:70;72:76; 78:82;84:88;90:94;96:100;102:106;108:112;114:118;120:124;126:130;132:136;138:142;144:148; 150:154;156:160;162:166;168:172;174:178;180:184;186:190;192:196;198:202;204:208;210:214;216:220;222:226;228:232;234:238;240:244"
На ум приходит ограничение для функций Excel в 30 аргументов. Наверное, тут действуют те же принципы. А в этой строке их 40.

Про 30 аргументов можно увидеть, например, в окне отладки Excel, введя:

Application.WorksheetFunction.Sum(

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


P.S. Впрочем, пишут, что в Excel 2007 "Максимальное число аргументов функции увеличилось с 30 до 255."

http://msdn.microsoft.com/ru-ru/library/aa730920.aspx
За это сообщение автора поблагодарили: MironovI (2).
Старый 17.12.2008, 13:22   #12  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Да,цивилизованный метод рулит

PS правда поскорости сливает.. жость..
лан, пища есть- бум переваривать..

Последний раз редактировалось MironovI; 17.12.2008 в 13:34.
Старый 17.12.2008, 14:44   #13  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Поискал, нет примера вариантного массива в аксе.
Кстати, а зачем нужно программно выполнять такую задачу? Мы в свое время делали это для построения диаграмм. Какие еще задачи требуют этого?
Старый 17.12.2008, 14:48   #14  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Задался целю копировать формат секции отчета сразу на диапазон ячеек (именно форматирование - специальой вставкой) Т.е. данные в отчет выводятся скопом через ADO или буфер обмена, а стиль накладывается сверху. Поскольку секция строк прерывается секцией групп - зпоминаю все диапозоны в отчете и разом к ним применяю формат секции.
Вобщем пока что остановился на варианте - строка через точку с запятой, но по 30 значений (дапазонов) в цикле форматирую.

Последний раз редактировалось Gustav; 19.12.2008 в 09:15. Причина: первоначально из-за опечатки было написано ДДЕ (вместо ADO)
Старый 17.12.2008, 15:52   #15  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от MironovI Посмотреть сообщение
Задался целю копировать формат секции отчета сразу на диапазон ячеек (именно форматирование - специальой вставкой) Т.е. данные в отчет выводятся скопом через ADO или буфер обмена, а стиль накладывается сверху. Поскольку секция строк прерывается секцией групп - зпоминаю все диапозоны в отчете и разом к ним применяю формат секции.
Так а скопировать секцию группы+секцию данных на целократный большой диапазон? Сформатировать строку 5, строки 6:10, а затем скопировать строки 5:10 в строки 11:244. В секциях одинаковое количество строк?

Последний раз редактировалось Gustav; 19.12.2008 в 09:25.
Старый 17.12.2008, 16:15   #16  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Иван, вот еще вариант из старого чулана. Думаю, должен понравиться

Если ты можешь использовать какую-то свободную колонку для простановки метки, которая будет означать, что это строка данных, то можно попробовать так (эту служебную колонку потом можно удалить):

1. Выбираешь пустую колонку. В VBA-примере ниже - это колонка A.
2. Если строку надо выделять и форматитровать, то пишем в эту колонку 1. В противном случае оставляем ячейку пустую.
3. Выполняем "ручную" операцию "Правка - Перейти - Выделить - Константы - Числа".
4. Получившееся выделение распространяем на всю ширину листа.

На VBA это выглядит примерно вот так:
Код:
 
Sub ExcelVBAMacro1()

    Dim rng As Range

    'как будто это мы проставили при выводе отчета:   
    Range("A12:A16,A18:A22,A24:A28,A30:A34,A36:A40").Value = 1 
    'если строка будет капризничать, то заменить , на ;
    
    Set rng = ActiveSheet.Columns("A:A")
    
    Set rng = rng.SpecialCells(xlCellTypeConstants, 1).EntireRow
    rng.Select
    
End Sub

Результат работы этого кода:

Нажмите на изображение для увеличения
Название: ranges.jpg
Просмотров: 589
Размер:	80.5 Кб
ID:	4066
Старый 18.12.2008, 10:30   #17  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Эх понравилось.. тут получается правда под каждую секцию отчета нужно свою колонку отдельную.. жаль при "найти и выделить" нельзя указать конкретное значение типа 1 или 2.. ну тоже вариант по-любому
Старый 18.12.2008, 11:35   #18  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от MironovI Посмотреть сообщение
тут получается правда под каждую секцию отчета нужно свою колонку отдельную.. жаль при "найти и выделить" нельзя указать конкретное значение типа 1 или 2..
Не нужно отдельную колонку. Конкретно для двух вариантов можно использовать число для одного и текст для другого и сформировать два разных составных диапазона (синий и желтый):
Код:
Sub ExcelVBAMacro2()

    Dim rng As Range ' колонка А
    Dim rng1 As Range 'синий
    Dim rng2 As Range 'желтый
    
    Range("A5:A8,A15:A17,A24:A27").Value = 1
    Range("A9:A13,A18:A22,A28:A32").Value = "a"
    
    Set rng = ActiveSheet.Columns("A:A")
    
    Set rng1 = rng.SpecialCells(xlCellTypeConstants, 1).EntireRow
    rng1.Interior.ColorIndex = 37
    
    Set rng2 = rng.SpecialCells(xlCellTypeConstants, 2).EntireRow
    rng2.Interior.ColorIndex = 6
    
End Sub
Нажмите на изображение для увеличения
Название: ranges2.jpg
Просмотров: 649
Размер:	43.7 Кб
ID:	4068

И еще в запасе несколько подобных "индикаторов" - пустые, логические, ошибочные даже (можно ввести в ячейку формулу =0/0 и получить ошибку, которую можно выделить ):

Название: ranges2g.jpg
Просмотров: 11491

Размер: 23.0 Кб

Но, согласен, если бы можно было помимо "Константа - Число" еще при этом и конкретное число указывать - было бы очень удобно для подобных манипуляций.
Старый 18.12.2008, 13:37   #19  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Эх, разошёлся я, раскочегарился
Цитата:
Сообщение от Gustav Посмотреть сообщение
если бы можно было помимо "Константа - Число" еще при этом и конкретное число указывать - было бы очень удобно для подобных манипуляций.
Как мне только что стало ясно, достаточно всего двух колонок: в одной целые числа - метки секций, а в другой формула-индикатор. После окончания вывода всех данных отчета значения индикатора меняем в небольшом цикле, последовательно перебирающем все возможные уникальные значения из первой колонки.

На каждом шаге фиксируется диапазон (несколько несоседних строк) для конкретной метки. "Фиксируется" - в соответствующую объектную переменную, в Аксапте это будут COMы, здесь в Excel мы можем себе позволить массив типа Range.

С каждым таким составным диапазоном потом можно делать что угодно. В нижеследующем VBA-примере я их расцвечиваю разными цветами:
Код:
Sub ExcelVBAMacro3()

    Dim rngB As Range  'колонка B
    Dim rng(1 To 10) As Range 'массив диапазонов

    Dim z As Integer
    Dim i As Integer
    
    ActiveWorkbook.Names.Add Name:="current", RefersToR1C1:="=0"
    
    'генерирование тестовых данных - в 2 колонки
    For z = 1 To 4
        For i = 1 To 10
            'меточные значения в колонке A
            Cells((z - 1) * 10 + i, 1).Value = i
            
            'формулы с "ошибкой-индикатором" в колонке B
            Cells((z - 1) * 10 + i, 2).FormulaR1C1 = "=RC[-1]/(RC[-1]-current)"
        Next i
    Next z
    
    Set rngB = Range(Range("B1"), Range("B1").End(xlDown))
    
    'определение диапазонов
    For i = 1 To 10
        'фактически присваивание current = i
        ActiveWorkbook.Names.Add Name:="current", RefersToR1C1:="=" & CStr(i)
        
        '"Правка - Перейти - Выделить - Формулы - Ошибки".
        Set rng(i) = rngB.SpecialCells(xlCellTypeFormulas, 16).EntireRow
    Next i
    
    'визуализация диапазонов расцвечиванием
    For i = 1 To 10
        rng(i).Interior.ColorIndex = i
    Next i
    
End Sub
Нажмите на изображение для увеличения
Название: ranges3.jpg
Просмотров: 654
Размер:	78.9 Кб
ID:	4070
Старый 18.12.2008, 13:57   #20  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Если бы не скорость.. я вообще пытаюсь движок написать вывода отчетов.. строк так на 60000 должно быстро пахать, проставление значений по ячекам долго..
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
gl00mie: Read Excel table via ADO Blog bot DAX Blogs 2 09.04.2010 08:32
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Как выделить все записи в гриде скопировать и отправить в Excel??? velk DAX: Программирование 36 22.12.2005 14:35
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:16.