|  17.12.2008, 10:56 | #1 | 
| Участник | Выделить несколько диапазонов одновременно (в 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 | 
| Участник | 
			
			Попробуй для разделения диапазонов вместо запятой указать точку с запятой. Как вариант, вместо строки передавать вариантный массив. Если найду пример передачи из Аксы, выложу (в свое время в 1С выкручивались именно с вариантным массивом, насчет аксы не помню, есть ли пример).
		 | 
|  | |
| За это сообщение автора поблагодарили: Alenka (1). | |
|  17.12.2008, 11:14 | #3 | 
| Участник | 
			
			Точка с запятой не прокатила..
		 | 
|  | 
|  17.12.2008, 11:18 | #4 | 
| int 20h | 
			
			Добрый день, попробуйте почитать вот этот пост Еще проблема с Excel при построении диаграмм может натолкнёт на мысли 
				__________________ It's just my Unhopelessnessabilityerism   Trying to debug my mind   | 
|  | 
|  17.12.2008, 12:01 | #5 | 
| Участник | 
			
			А какой символ у вас стоит в качестве 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 | 
| Участник | 
			
			Точка с запятой..   Я и ее и запятую пробовал.. Должно работать думаете? | 
|  | 
|  17.12.2008, 12:08 | #7 | 
| Участник | 
			
			Вай шайтан, заработало, точка с запято, почему-то не с первого раза, видимо поняла что упираться безсмыслено, всем спасибо!
		 | 
|  | 
|  17.12.2008, 12:16 | #8 | 
| Участник | Цитата: Иначе можете получить код, который не будет работать на тех ПК настройки которых отличны от ";".   | 
|  | 
|  17.12.2008, 12:31 | #9 | 
| Участник | 
			
			Да, эт я понял.  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 | 
| Moderator | 
			
			Дозвольте со своим пятаком влезть. Существует более человеческий способ объединения диапазонов - методом 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 | 
| Moderator | Цитата: 
		
			Сообщение от 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" Про 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 | 
| Участник | 
			
			Да,цивилизованный метод рулит   PS правда поскорости сливает.. жость.. лан, пища есть- бум переваривать.. Последний раз редактировалось MironovI; 17.12.2008 в 13:34. | 
|  | 
|  17.12.2008, 14:44 | #13 | 
| Участник | 
			
			Поискал, нет примера вариантного массива в аксе. Кстати, а зачем нужно программно выполнять такую задачу? Мы в свое время делали это для построения диаграмм. Какие еще задачи требуют этого? | 
|  | 
|  17.12.2008, 14:48 | #14 | 
| Участник | 
			
			Задался целю копировать формат секции отчета сразу на диапазон ячеек (именно форматирование - специальой вставкой)  Т.е. данные в отчет выводятся скопом через ADO или буфер обмена, а стиль накладывается сверху. Поскольку секция строк прерывается секцией групп - зпоминаю все диапозоны в отчете и разом к ним применяю формат секции. Вобщем пока что остановился на варианте - строка через точку с запятой, но по 30 значений (дапазонов) в цикле форматирую. Последний раз редактировалось Gustav; 19.12.2008 в 09:15. Причина: первоначально из-за опечатки было написано ДДЕ (вместо ADO) | 
|  | 
|  17.12.2008, 15:52 | #15 | 
| Moderator | Цитата: 
		
			Сообщение от MironovI
			   Задался целю копировать формат секции отчета сразу на диапазон ячеек (именно форматирование - специальой вставкой)  Т.е. данные в отчет выводятся скопом через ADO или буфер обмена, а стиль накладывается сверху. Поскольку секция строк прерывается секцией групп - зпоминаю все диапозоны в отчете и разом к ним применяю формат секции. Последний раз редактировалось Gustav; 19.12.2008 в 09:25. | 
|  | 
|  17.12.2008, 16:15 | #16 | 
| Moderator | 
			
			Иван, вот еще вариант из старого чулана. Думаю, должен понравиться   Если ты можешь использовать какую-то свободную колонку для простановки метки, которая будет означать, что это строка данных, то можно попробовать так (эту служебную колонку потом можно удалить): 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Результат работы этого кода: | 
|  | 
|  18.12.2008, 10:30 | #17 | 
| Участник | 
			
			Эх понравилось.. тут получается правда под каждую секцию отчета нужно свою колонку отдельную.. жаль при "найти и выделить" нельзя указать конкретное значение типа 1 или 2.. ну тоже вариант по-любому    | 
|  | 
|  18.12.2008, 11:35 | #18 | 
| Moderator | Цитата: Код: 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И еще в запасе несколько подобных "индикаторов" - пустые, логические, ошибочные даже (можно ввести в ячейку формулу =0/0 и получить ошибку, которую можно выделить  ): Но, согласен, если бы можно было помимо "Константа - Число" еще при этом и конкретное число указывать - было бы очень удобно для подобных манипуляций. | 
|  | 
|  18.12.2008, 13:37 | #19 | 
| Moderator | 
			
			Эх, разошёлся я, раскочегарился   Цитата: На каждом шаге фиксируется диапазон (несколько несоседних строк) для конкретной метки. "Фиксируется" - в соответствующую объектную переменную, в Аксапте это будут 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 | 
|  | 
|  18.12.2008, 13:57 | #20 | 
| Участник | 
			
			Если бы не скорость..  я вообще пытаюсь движок написать вывода отчетов.. строк так на 60000 должно быстро пахать, проставление значений по ячекам долго..   | 
|  | 
|  | 
| 
 |