Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 14:29   #1
scratik
Новичок
Джуниор
 
Регистрация: 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

ПыСы если нужно приложить пример, то это легко сделать. Но мне кажется, что тут совсем не сложно.

жду и надеюсь)
scratik вне форума Ответить с цитированием
Старый 23.06.2011, 14:38   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

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.
Hugo121 вне форума Ответить с цитированием
Старый 23.06.2011, 14:41   #3
Watcher_1982
Пользователь
 
Регистрация: 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 пожалуйста поясните поподробнее...
Watcher_1982 вне форума Ответить с цитированием
Старый 23.06.2011, 14:46   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Watcher_1982, мелочь не заметили:
If a(i, 20) = 1 Then
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 23.06.2011, 14:49   #5
Watcher_1982
Пользователь
 
Регистрация: 23.06.2011
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Watcher_1982, мелочь не заметили:
If a(i, 20) = 1 Then
Да действительно
Я зациклился на копировании....
Watcher_1982 вне форума Ответить с цитированием
Старый 23.06.2011, 15:13   #6
scratik
Новичок
Джуниор
 
Регистрация: 21.06.2011
Сообщений: 7
По умолчанию

Hugo121,

Да, код ваш Вы мне подсказывали на planetexcel

я правильно сделал замены? Выдает ошибку на строке "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.
scratik вне форума Ответить с цитированием
Старый 23.06.2011, 15:24   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Не совсем правильно - раз массив стал уже, то и единицы вероятно не на 20-м месте, а на 18-м. Тем более, что 20-го уже нет вообще, поэтому и ругается.
Ну и вставлять тогда нужно не в [a3:t3], а в [c3:t3] (кстати, почему тут t2 было?)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание макроса 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