![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 21.06.2011
Сообщений: 7
|
![]()
Добрый день всем! 8)
Не справляюсь без помощи( Есть книга с двумя листами. Первый - "База", а второй - "Отчет" Мне нужно, чтобы в приведенном ниже коде изменить его так, чтобы ... 1) чтобы он (код) был привязан не ко 2му листу по счету, а к листу с названием "Отчет". 2) сейчас он копирует значения в диапазоне "A:T" начиная со столбца А:А на лист "Отчет"... а как сделать так, чтобы он делал то же самое, но копировал начиная со столбца С:С? 3) а также нужно, чтобы перед копированием, он очищал содержимое тех столбцов, куда помещает новые значения (кроме первых 2 строчек - в них названия столбцов и прочее). (!) Вариант с очисткой всего листа не подходит, так как на этом листе уже есть формулы, которые нельзя удалять. Sub Massiv() Dim tm: tm = Timer Dim a, b, i&, ii&, k& With Sheets(1) a = .Range(.[A1], .Range("T" & .Rows.Count).End(IIf(Len(.Range("T" & .Rows.Count)), xlDown, xlUp))).Value End With ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2)) For i = 1 To UBound(a) If a(i, 20) = 1 Then ii = ii + 1 For k = 1 To 20: b(ii, k) = a(i, k): Next End If Next Sheets(2).[a3:t2].Resize(ii) = b Debug.Print "array: "; Timer - tm End Sub ПыСы если нужно приложить пример, то это легко сделать. Но мне кажется, что тут совсем не сложно. жду и надеюсь) |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
1) чтобы он (код) был привязан не ко 2му листу по счету, а к листу с названием "Отчет".
Sheets("Отчет").[a3:t2].Resize(ii) = b 2) сейчас он копирует значения в диапазоне "A:T" начиная со столбца А:А на лист "Отчет"... а как сделать так, чтобы он делал то же самое, но копировал начиная со столбца С:С? a = .Range(.[C1], .Range("T" & .Rows.Count).End(IIf(Len(.Range("T" & .Rows.Count)), xlDown, xlUp))).Value 3) а также нужно, чтобы перед копированием, он очищал содержимое тех столбцов, куда помещает новые значения (кроме первых 2 строчек - в них названия столбцов и прочее). Так код и так заменяет содержимое этих ячеек содержимым массива, т.е. спецочистка не нужна. Правда он заменяет только под актуальный размер, если ранее данных было больше, то они ниже останутся... Тогда типа так: Sheets(2).[a3:t2000].ClearContents или обработать UsedRange или определить iLastrow и использовать это значение. Или сперва определить Sheets(2).[a3].CurrentRegion.Rows.Count и взять это значение. Вариантов много... P.S. Код почерком похож на мой, но я такого не помню. Похоже, что скомпонован из кусков моих кодов или одного переработанного. И это правильно, сам так обычно делаю ![]() И вероятно лучше привязать не к имени листа Sheets("Отчет"), а к его кодовому имени (смотрите в редакторе). Тогда будет что-то вроде Лист2.[a3:t2].Resize(ii) = b Так Вы подстрахуетесь от случайного изменения юзером названия листа - теперь как его не переименовывай, писаться будет в этот лист.
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 23.06.2011 в 15:18. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 23.06.2011
Сообщений: 10
|
![]()
Приветствую!
вот код Sub Massiv() Sheets(1).Range("A1").End(xlDown).S elect myR = Selection.Row Sheets(2).Range("C2:T" & myR).ClearContents Sheets(1).Range("C2:T" & myR).Copy Destination:=Sheets(2).Range("C2") End Sub Пункт 3 пожалуйста поясните поподробнее... |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Watcher_1982, мелочь не заметили:
If a(i, 20) = 1 Then
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 23.06.2011
Сообщений: 10
|
![]() |
![]() |
![]() |
![]() |
#6 |
Новичок
Джуниор
Регистрация: 21.06.2011
Сообщений: 7
|
![]()
Hugo121,
Да, код ваш ![]() ![]() я правильно сделал замены? Выдает ошибку на строке "If a(i, 20) = 1 Then" ( Sub Massiv() Dim tm: tm = Timer Dim a, b, i&, ii&, k& With Sheets("База") a = .Range(.[C1], .Range("T" & .Rows.Count).End(IIf(Len(.Range("T" & .Rows.Count)), xlDown, xlUp))).Value End With ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2)) For i = 1 To UBound(a) If a(i, 20) = 1 Then ii = ii + 1 For k = 1 To 20: b(ii, k) = a(i, k): Next End If Next Sheets("Отчет").[a3:t2].Resize(ii) = b Debug.Print "array: "; Timer - tm End Sub ПыСы проясню по поводу пункта №2, а то вдруг меня не правильно поняли. Мне нужно чтобы он также копировал тоже количество столбцов, но вставлял их на лист отчет не с "А:А", а с "С:С" ... Последний раз редактировалось scratik; 23.06.2011 в 15:17. |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Не совсем правильно - раз массив стал уже, то и единицы вероятно не на 20-м месте, а на 18-м. Тем более, что 20-го уже нет вообще, поэтому и ругается.
Ну и вставлять тогда нужно не в [a3:t3], а в [c3:t3] (кстати, почему тут t2 было?)
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание макроса | SeregaSled | Microsoft Office Access | 2 | 28.12.2009 05:55 |
Приоритет макроса | ru3000 | Microsoft Office Excel | 4 | 02.09.2009 04:45 |
Изменение макроса | Vaniq | Microsoft Office Excel | 2 | 25.08.2009 13:45 |
Разблокировка макроса | Deni55 | Microsoft Office Excel | 4 | 18.04.2009 17:58 |
Запуск макроса с параметрами из другого макроса | Saladin | Microsoft Office Excel | 2 | 19.01.2009 09:43 |