перенос данных диапазоном, помогите с синтаксисом

Автор iKriss, 25.09.2012, 17:56

« назад - далее »

iKriss

Добрый день.
Подскажите, пожалуйста, как можно задать в макросе копирование строк формы на другой лист, причем без необходимости указания ячейки для копирования для каждого значения. Т.е. есть диапазон A1-A10 в форме, туда могут заносится некие числа, причем диапазон может быть заполнен как полностью, так и частично. По нажатию кнопки все внесенные значения переносятся в диапазон B2-B12 на другом листе. Пока умею только вот так переносить:
PS = Sheets("Лог").Range("A" & Rows.Count).End(xlUp).Row + 1
    Sheets("Лог").Cells(PS, 1) = Now
    Sheets("Лог").Cells(PS, 2) = Range("B4")
    Sheets("Лог").Cells(PS, 3) = Range("C7")
    Sheets("Лог").Cells(PS, 4) = Range("C8")
    Sheets("Лог").Cells(PS, 5) = Range("C9")


Как можно по-другому переносить значения?
Хотелось бы понять, как именно нужно задать диапазон, в который вносятся значения и как наладить перенос?
Логика работы предполагается следующая:
1. Прога определяет количество внесенных в первый диапазон значений.
2. Определяет последнюю заполненную строку во втором диапазоне (в том, куда будет переносится информация)
3. Спускается на одну строчку ниже (первую незаполненную)
4. Добавляет туда первое значение из "формы"
5. Добавляет все остальные значения

мне бы просто "перевести" эту последовательность на язык vba ) а дальше уже разберусь )
спасибо заранее

Wasilic

Один из множества вариантов копирования диапазона.
PS1 = Sheets("Лист1").Range("A" & Rows.Count).End(xlUp).Row
PS2 = Sheets("Лист2").Range("A" & Rows.Count).End(xlUp).Row+1
Dim otkuda As Range
Dim kuda As Range
Set otkuda = Sheets("Лист1").Range("A1:B" & PS1)
Set kuda = Sheets("Лист2").Range("A" & PS2)
otkuda.Copy kuda

А здесь много готовых решений на VBA:
http://msoffice.nm.ru/faq/macros.htm

Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

iKriss

Супер, спасибо!
А теперь еще вопрос, если можно ))
как сделать так, чтобы макрос проверял диапазон "kuda", и, в случае совпадений значений, введенных в диапазон "otkuda", проставлял справа от таких же значений диапазона "kuda" некий текст?
Спасибо заранее!

Wasilic

Цитата: iKriss от 26.09.2012, 12:37
как сделать так, чтобы макрос проверял диапазон "kuda", и, в случае совпадений значений, введенных в диапазон "otkuda"
Никак!
"otkuda" и "kuda" это переменные содержащие координаты диапазона откуда надо копировать данные и куда копировать.
Тем более что, в данном примере, координаты "kuda" - пустое место.
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

iKriss

А как тогда реализовать такую задачу? Сравнение диапазонов и проставление отметок в случае совпадения?

Wasilic

Цитата: iKriss от 27.09.2012, 10:39
Сравнение диапазонов и проставление отметок в случае совпадения?
Ну эта задача больше к формулистам. А пока посмотрите эти ссылки
https://forum.msexcel.ru/microsoft_excel/sravnenie_dvuh_diapazonov_spiskov-t8533.0.html
https://forum.msexcel.ru/microsoft_excel-b1.760/;sort=subject;desc
Возможно найдете свое решение.
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

kuklp

iKriss, давайте-ка заглянем в правила форума. Особое внимание п.2.
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

iKriss

Цитата: Wasilic от 27.09.2012, 22:17
Цитата: iKriss от 27.09.2012, 10:39
Сравнение диапазонов и проставление отметок в случае совпадения?
Ну эта задача больше к формулистам. А пока посмотрите эти ссылки
https://forum.msexcel.ru/microsoft_excel/sravnenie_dvuh_diapazonov_spiskov-t8533.0.html
https://forum.msexcel.ru/microsoft_excel-b1.760/;sort=subject;desc
Возможно найдете свое решение.


Спасибо за ответ, но формулы не устраивают. В данном случае все должно работать именно по макросам, чтобы из диапазона, куда вводятся значения, после работы макроса данные удалялись. То есть механика следующая:
1. В диапазон otkuda вводятся данные
2. По нажатию кнопки макрос построчно сравнивает данные с бОльшим, чем otkuda, диапазоном kuda, в случае выявления совпадений в соседний с диапазоном kuda столбец проставляет некоторую отметку, например "сдан"
3. По завершении работы макроса диапазое otkuda очищается.

Пример приложу, на всякий случай, но его не выкладывал изначально, потому что нужен только примерный синтаксис, не хочу уже готовое решение, хочется самому додумать и доделать. Пока предполагаю лишь, что здесь можно как-то использовать оператор If....then, трудность вижу в том, что размер диапазонов разный, в связи с чем нужно этот IF как-то прописать так, чтобы он брал первое значение из диапазона otkuda, сравнивал его со всеми значениями диапазона kuda, выполнял или не выполнял какую-либо операцию, после чего брал следующее значение диапазона otkuda и так далее до последней заполненной ячейки диапазона otkuda...

файл с примером прикладываю, в примере диапазно otkuda  - это лист "прием актов", а диапазон kuda - это лист "лог выданных актов", сравнение идет по номерам в столбцах A и B листа "прием актов", а также по ячейке "мастер".
Спасибо всем помогшим и помогающим =) В долгу не останусь =)

Wasilic

#8
Цитата: iKriss от 28.09.2012, 15:17
чтобы он брал первое значение из диапазона otkuda, сравнивал его со всеми значениями диапазона kuda, выполнял или не выполнял какую-либо операцию, после чего брал следующее значение диапазона otkuda и так далее до последней заполненной ячейки диапазона otkuda...
В общем то, задача макросом решаема. Но есть одно но. Чем больше данных на листе «Лог выданных» тем дольше будет производится поиск совпадений.
Если на листе «Прием актов» будет 25 актов и 25 БСО, то макрос должен будет просмотреть Лог выданных 50 раз. Не проще ли проконтролировать совпадение номеров на момент  ввода. См. пример.
Макрос на кнопке СРАВНИТЬ. Хотя, наверняка, есть более быстродействующий макрос, но это уже к Сергею KuklP.
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

kuklp

#9
Можно еще так проверять, но лучше, действительно, на момент ввода. Хотя и так д.б. достаточно быстро:
Sub КнопкаСравнить1()
   Dim i&, r, e&
   r = Sheets("Лог выданных").Range("B1:B" & Sheets("Лог выданных").Range("B" & Rows.Count).End(xlUp).Row)
   On Error Resume Next
   For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
       e = 0: e = Application.Match(Cells(i, 1), Application.Index(r, , 1), 0)
       Sheets("Лог выданных").Range("I" & e) = IIf(Err, "", Cells(i, 1) & " сдан " & [d1]): Err.Clear
   Next
   r = Sheets("Лог выданных").Range("d1:d" & Sheets("Лог выданных").Range("d" & Rows.Count).End(xlUp).Row)
   For i = 2 To Range("b" & Rows.Count).End(xlUp).Row
       e = 0: e = Application.Match(Cells(i, 2), Application.Index(r, , 1), 0)
       Sheets("Лог выданных").Range("J" & e) = IIf(Err, "", Cells(i, 2) & " сдан " & [d1]): Err.Clear
   Next
End Sub

Сделал еще и на момент ввода.
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

iKriss

Спасибо, господа, ща будем тестить оба варианта!

iKriss

Эмм... пока не очень понятно, как именно работает макрос. Идет сравнение двух диапазонов, промежуточные результаты выводятся в желтом диапазоне. По нажатию кнопки ничего не происходит, верно? А как можно сделать так, чтобы вносились изменения в "лог выданных"? я частично уловил идею, но пока не могу подхватить. пожалуйста, чуть больше деталей по работе макроса =) смотрю в код и вижу фигу ) в каком направлении дальше двигаться? предполагается в этой базе еще и денежные потоки считать, а я пока и в этом даже не могу разобраться =(( обидно, когда решение почти в "кармане", но использовать его не удается =(

kuklp

Просто вносите значения в Выдача актов и БСО    на листе Прием актов. И потом смотрите в Лог выданных.
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

iKriss

а как именно работает кнопка "сравнить"? это вроде как промежуточные итоги проверки наличия актов у мастера, верно?

kuklp

#14
Это вопрос к Wasilic:-) Выложенному мной варианту КнопкаСравнить1 Вы кнопку не назначали. О "наличии актов у мастера" нам ничего неизвестно. Мы оперируем строками, столбцами и ячейками. Поэтому Вам лучше задавать вопросы с учетом вышесказанного:-)
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771