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

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

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

iKriss

#15
блин, совсем запутался  :'(
зачем нужен еще макрос в Лист4 следующего вида:

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim i&, r, e&
   On Error Resume Next
   Select Case Target.Column
   Case 1
       r = Sheets("Лог выданных").Range("B1:B" & Sheets("Лог выданных").Range("B" & Rows.Count).End(xlUp).Row)
       e = 0: e = Application.Match(Target, Application.Index(r, , 1), 0)
       Sheets("Лог выданных").Range("I" & e) = IIf(Err, "", Target & " сдан " & [d1]): Err.Clear
   Case 2
       r = Sheets("Лог выданных").Range("d1:d" & Sheets("Лог выданных").Range("d" & Rows.Count).End(xlUp).Row)
       e = 0: e = Application.Match(Target, Application.Index(r, , 1), 0)
       Sheets("Лог выданных").Range("J" & e) = IIf(Err, "", Target & " сдан " & [d1]): Err.Clear
   End Select
End Sub


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

и зачем тогда вот этот код?:

Sub КнопкаСравнить()
   PS1 = Range("A" & Rows.Count).End(xlUp).Row
   PS2 = Sheets("Лог выданных").Range("B" & Rows.Count).End(xlUp).Row
   For i = 2 To PS1
     AKT = Cells(i, 1)
     BSO = Cells(i, 2)
     MAS = Range("D1")
     With Sheets("Лог выданных")
        If AKT <> "" Then
           For A = 2 To PS2
              If .Cells(A, 2) = AKT And .Cells(A, 6) = MAS Then
                 .Cells(A, 3) = " СДАН "
              End If
           Next
        End If
        If BSO <> "" Then
           For B = 2 To PS2
              If .Cells(B, 4) = BSO And .Cells(B, 6) = MAS Then
                 .Cells(B, 5) = " Сдан "
              End If
           Next
        End If
     End With
   Next
End Sub


тут, вроде, все понятно вполне, как раз то, что нужно. Для чего дополнительный модуль, если они делают одно и то же?

iKriss

Так, понял. Я тупица  :-\
назначил на кнопку предложенный Вами, Сергей, макрос.
Поясните, пожалуйста, как именно он работает, если не трудно, построчно =)
пытаюсь разобраться в нем, не удается  :'(

Sub КнопкаСравнить1()
    Dim i&, r, e& ///тут задаются переменные некие, верно?
    r = Sheets("Лог выданных").Range("B1:B" & Sheets("Лог выданных").Range("B" & Rows.Count).End(xlUp).Row) /// тут тоже вроде понятно, объясняем, что такое r, привязывая ее к столбцу "Акты" на листе "выдача актов"
    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) /// заново задается переменная r?
    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


Пожалуйста, разложите "по полочкам" этот макрос. Понимаю, что уже немного обнаглел, но, раз помогаете, помогите, пожалуйста, до конца  :-[

kuklp

#17
Цитироватькак сделать так, чтобы "сдан" выводилось не в отдельный столбик, а просто вносились изменения в столбец "статус", т.е. вместо "выдан" появлялась надпись "сдан"?
Исправил для модуля листа. Объясняла из меня тот еще, но как смог.
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim i&, r, e&
   On Error Resume Next
   Select Case Target.Column
   Case 1
       r = Sheets("Лог выданных").Range("B1:B" & Sheets("Лог выданных").Range("B" & Rows.Count).End(xlUp).Row)
       e = 0: e = Application.Match(Target, Application.Index(r, , 1), 0)
' здесь е равно либо строке с искомым номером, либо ошибке, в случае ее отсутствия
' Application.Match - это формула листа поискпоз, используется, чтоб не перебирать все строки в цикле.
       Sheets("Лог выданных").Range("C" & e) = IIf(Err, "", "Сдан"): Err.Clear
'если ошибки нет, в строку с номером е пишем слово "сдан"
   Case 2
'тут все так же, только для другого столбца.
       r = Sheets("Лог выданных").Range("d1:d" & Sheets("Лог выданных").Range("d" & Rows.Count).End(xlUp).Row)
       e = 0: e = Application.Match(Target, Application.Index(r, , 1), 0)
       Sheets("Лог выданных").Range("E" & e) = IIf(Err, "", "Сдан"): Err.Clear
   End Select
End Sub

Теперь при внесении номера в Прием актов, будет автоматически искаться такой номер в логе. Т.е. макросы КнопкаСравнить и КнопкаСравнить1 уже не нужны.
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

iKriss

Понимание постепенно проявляется, но не полностью =)
Подскажите, пожалуйста, как привязать сравнение не только по номерам актов и БСО (ячейки листа "Прием актов"), а еще и по ячейке "E1" - "фамилия мастера"

iKriss

И все-таки надо на кнопку сделать макрос. Т.к. изменения происходят по вводу сразу же, в случае ошибки надо лезть в "лог выданных" и править, а так - зашел, вбли номера, проверил, потом нажал "готово" и программа выполнилась. Можно ли просто переписать в первой строчке "Sub кнопка_принять", чтобы он работал не по изменению, а по кнопке? И куда и в каком виде надо дописать еще один критерий? )

Спасибо огромное за Вашу неоценимую помощь! :)

kuklp

Никак. У Вас в обоих листах актов мастер один, указан в заголовке. Иначе придется переделывать на них структуру таблиц, добавлять колонки с мастерами. И алгоритм сравнения будет совсем другой. А потом вы придумаете еще какое-нибудь условие? Мне уже жаль впустую потраченного времени...
PS Вашим мастерам выдают акты с одинаковыми номерами? Это мягко говоря, странно.
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

iKriss

Это условие изначально было. ОК, нельзя - так нельзя. Можно ли просто перепривязать на кнопку? Или надо сам макрос переписывать. И время не впустую потрачено, отнюдь! Оба вариант макроса, кои мне тут сделали, будут использованы в дальнейшей работе обязательно!

kuklp

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

iKriss


Wasilic

Цитата: iKriss от 02.10.2012, 10:50
И все-таки надо на кнопку сделать макрос. Т.к. изменения происходят по вводу сразу же, в случае ошибки надо лезть в "лог выданных" и править, а так - зашел, вбли номера, проверил, потом нажал "готово" и программа выполнилась. Можно ли просто переписать в первой строчке "Sub кнопка_принять", чтобы он работал не по изменению, а по кнопке? И куда и в каком виде надо дописать еще один критерий? )
iKriss Ваша путаница распутана моим самым первым примером. А Вы его наверное и не смотрели. Я изначально догадался, что Вам нужна проверка на случай повторного ввода номеров, и предложил формулы, проверка по которым проводится при вводе, это таблица на желтом фоне. Как только будет введен номер повторно, в таблице сразу же высветится сообщение и фамилия вводившего мастера.
Параллельно сделал макрос по выше описанным требованиям и так же с проверкой по мастеру.
Вы писали:
Цитата: iKriss от 28.09.2012, 15:17
Пример ... не выкладывал изначально, потому что нужен только примерный синтаксис, не хочу уже готовое решение, хочется самому додумать и доделать.
Когда начнете? :)
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

iKriss

Я его смотрел, но, Вы же сами потом говорили, что лучше посмотреть пример Сергея, потому что он будет работать быстрее. Сейчас рассмотрю подробнее )) Ваш пример понятнее и проще, просто пытаюсь разобраться в варианте Сергея, но вижу фигу =)

iKriss

Вроде все учел в примере. Список мастеров - на листе "мастера", оттуда берутся значения для списка. Добавил еще столбец "сумма" - это сумма денег по каждому акту и БСО (акт и БСО только вместе сдаются) )

kuklp

Вы еще больше запутали. Во-первых:
Цитировать"сумма" - это сумма денег по каждому акту и БСО (акт и БСО только вместе сдаются)
а в Лог выданных номера вразнобой. Какую сумму там, куда надо вносить?
Дальше, в Прием актов наверное, надо делать структуру:
Акт   Мастер:   БСО   Мастер:
?
И можно расшифровку аббревиатуры "БСО"? Мож так понятней станет...
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Wasilic

#28
Стою на асфальте в лыжи обутый, толи лыжи не едут толи я ...  ;D
ничего не понял из:
Цитироватьздесь проверка следующим образом: если такой акт есть у мастера, то пишем "ок", если нет такого акта, то пишем "ошибка",
понял только это:
Цитироватькнопку можно нажать и запустить макрос, только если везде "ок"
И еще:
1. Проверку оставить формулами?
2. Проверять только акты или и БСО?

PS. Заполните от руки обе таблицы с заведомо одинаковыми номерами, выделите эти номера цветом и проставьте там где нужно, надписи "ок" и "ошибка".
Может так разберусь, что надо сделать.  :)
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

iKriss

Цитата: KuklP от 02.10.2012, 12:46
Вы еще больше запутали. Во-первых:
Цитировать"сумма" - это сумма денег по каждому акту и БСО (акт и БСО только вместе сдаются)
а в Лог выданных номера вразнобой. Какую сумму там, куда надо вносить?
Дальше, в Прием актов наверное, надо делать структуру:
Акт   Мастер:   БСО   Мастер:
?
И можно расшифровку аббревиатуры "БСО"? Мож так понятней станет...


нет, в "Прием актов" структура именно такая должна быть. один мастер приходит и сдает несколько актов и БСО, неудобно было бы писать каждый раз мастера. БСО = бланк строгой отчетности. Это типа фискального чека, если организация на ЕНВД )