8написал: все работает, но сумма сотрудников не вставляется столбец K Листа Табель, а копироваться с Листа Список J9;J13
Вот окончательный вариант. Думаю, изначально вы хотели что-то типа такого:
Скрытый текст
Sub Vstavlyaem_dannye()
Dim Uslugi As Variant, Klassy As Variant, Rabotniki As Variant Dim LastRow As Long, i As Long, Summa As Long Dim MyRange As Range Dim GosNomer As String, Telephone As String, FIO As String Dim Marka As String, Klass As String, VidPlateja As String, MyValue As String Dim Data As Date
'zadaem peremennye Worksheets("Список").Activate Data = Range("B1") GosNomer = Range("H3") Telephone = Range("H4") FIO = Range("H5") Marka = Range("H6") VidPlateja = Range("I1") Summa = Range("H1")
'opredelyaem klass Klassy = Range("C1:F2") For i = LBound(Klassy, 2) To UBound(Klassy, 2) If Klassy(1, i) = True Then Klass = Klassy(2, i) 'Nashli vybrannyi klass avto Exit For End If Next i
'vstavlyaem uslugi Set MyRange = Range(Cells(LastRow, 7), Cells(LastRow, 7))
For i = LBound(Uslugi, 1) To UBound(Uslugi, 1) If Uslugi(i, 1) = True Then If IsEmpty(MyRange) Then MyRange = Uslugi(i, 2) Else MyRange = MyRange & Chr(44) & Chr(32) & Uslugi(i, 2) End If End If Next i
'vstavlyaem summu Range(Cells(LastRow, 8, Cells(LastRow, 8)) = Summa 'vstavlyaem vid plateja Range(Cells(LastRow, 9), Cells(LastRow, 9)) = VidPlateja
'vstavlyaem rabotnikov i summu Set MyRange = Range(Cells(LastRow, 10), Cells(LastRow, 10)) For i = LBound(Rabotniki, 1) To UBound(Rabotniki, 1) If Rabotniki(i, 1) = True Then If IsEmpty(MyRange) Then MyRange = Rabotniki(i, 2) 'familiya Else MyRange = MyRange & Chr(44) & Chr(32) & Rabotniki(i, 2) End If End If Next i
Set MyRange = Range(Cells(LastRow, 11), Cells(LastRow, 11)) For i = LBound(Rabotniki, 1) To UBound(Rabotniki, 1) If Rabotniki(i, 1) = True Then If IsEmpty(MyRange) Then MyValue = Rabotniki(i, 3) 'summa Else MyValue = MyValue & Chr(43) & Rabotniki(i, 3) End If End If Next i
Dim Uslugi As Variant, Klassy As Variant, Rabotniki As Variant Dim LastRow As Long, i As Long, Summa As Long Dim MyRange As Range Dim GosNomer As String, Telephone As String, FIO As String Dim Marka As String, Klass As String, VidPlateja As String Dim Data As Date
'zadaem peremennye Worksheets("Ñïèñîê").Activate Data = Range("B1") GosNomer = Range("H3") Telephone = Range("H4") FIO = Range("H5") Marka = Range("H6") VidPlateja = Range("I1") Summa = Range("H1")
'opredelyaem klass Klassy = Range("C1:F2") For i = LBound(Klassy, 2) To UBound(Klassy, 2) If Klassy(1, i) = True Then Klass = Klassy(2, i) 'Nashli vybrannyi klass avto Exit For End If Next i
'vstavlyaem uslugi Set MyRange = Range(Cells(LastRow, 7), Cells(LastRow, 7))
For i = LBound(Uslugi, 1) To UBound(Uslugi, 1) If Uslugi(i, 1) = True Then If IsEmpty(MyRange) Then MyRange = Uslugi(i, 2) Else MyRange = MyRange & Chr(44) & Chr(32) & Uslugi(i, 2) End If End If Next i
'vstavlyaem summu Range(Cells(LastRow, 8, Cells(LastRow, 8)) = Summa 'vstavlyaem vid plateja Range(Cells(LastRow, 9), Cells(LastRow, 9)) = VidPlateja
'vstavlyaem rabotnikov Set MyRange = Range(Cells(LastRow, 10), Cells(LastRow, 10)) For i = LBound(Rabotniki, 1) To UBound(Rabotniki, 1) If Rabotniki(i, 1) = True Then If IsEmpty(MyRange) Then MyRange = Rabotniki(i, 2) Else MyRange = MyRange & Chr(44) & Chr(32) & Rabotniki(i, 2) End If End If Next i
Упростить никак. Надо все переписать. Сотрите все..., и оставьте вот этот один макрос:
Скрытый текст
Sub Vstavlyaem_dannye()
Dim Uslugi As Variant, Klassy As Variant, Rabotniki As Variant Dim LastRow As Long, i As Long Dim MyRange As Range Dim GosNomer As String, Telephone As String, FIO As String Dim Marka As String, Klass As String Dim Data As Date
'zadaem peremennye Worksheets("Список").Activate GosNomer = Range("H3") Telephone = Range("H4") FIO = Range("H5") Marka = Range("H6") Data = Range("B1")
'opredelyaem klass Klassy = Range("C1:F2") For i = LBound(Klassy, 2) To UBound(Klassy, 2) If Klassy(1, i) = True Then Klass = Klassy(2, i) 'Nashli vybrannyi klass avto Exit For End If Next i
'vstavlyaem uslugi Set MyRange = Range(Cells(LastRow, 7), Cells(LastRow, 7))
'перебираем For i = LBound(Uslugi, 1) To UBound(Uslugi, 1) If Uslugi(i, 1) = True Then 'если еще ни одно не перенесено If IsEmpty(MyRange) Then MyRange = Uslugi(i, 2) 'если уже был перенос значений Else MyRange = MyRange & Chr(44) & Chr(32) & Uslugi(i, 2) End If End If Next i
'vstavlyaem rabotnikov Set MyRange = Range(Cells(LastRow, 10), Cells(LastRow, 10)) For i = LBound(Rabotniki, 1) To UBound(Rabotniki, 1) If Rabotniki(i, 1) = True Then 'если еще ни одно не перенесено If IsEmpty(MyRange) Then MyRange = Rabotniki(i, 2) 'если уже был перенос значений Else MyRange = MyRange & Chr(44) & Chr(32) & Rabotniki(i, 2) End If End If Next i
'perebiraem znacheniya For i = 1 To UBound(MyValues, 1) LastRowNal = Cells(Rows.Count, 3).End(xlUp).Row 'poslednyaya stroka If MyValues(i, 1) = True Then Cells(LastRowNal + 1, 3) = MyValues(i, 2) Cells(LastRowNal + 1, 4) = MyValues(i, 3) End If Next i
'perebiraem znacheniya For i = 1 To UBound(MyValues, 1) LastRowNal = Cells(Rows.Count, 3).End(xlUp).Row 'poslednyaya stroka If MyValues(i, 1) = True Then Cells(LastRowNal + 1, 3) = MyValues(i, 2) Cells(LastRowNal + 1, 4) = MyValues(i, 3) 'добавляется эта строчка End If Next i
написал: Sub CopyInfo()'объявление переменныхDim iLastRowNal As LongDim iLastRowArhiv As LongSheets("Список").Select'проверка наличия данных (заполнености) последнего столбца таблицы iLastRowNal = Cells(Rows.Count, 2).End(xlUp).Row 'вычисление номера строки For i = 3 To iLastRowNalSheets("Список").Select If Cells(i, 1) = "True" Then 'определение последней заполненой строки на листе Архив iLastRowArhiv = Sheets("Табель").Cells(Rows.Count, 7).End(xlUp).Row + 1 Range(Cells(i, 2), Cells(i, 2)).Copy Sheets("Табель").Select LastRow = Cells(Rows.Count, "G").End(xlUp).Row + 1 Cells(LastRow, 7).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False End If Next i End Subдобавил к своему коду, все равно только 1 значение вводит
А у меня этот ваш код рабочий. Выдает как требуется.
'перебираем массив For i = 1 To UBound(MyValues, 1) LastRowNal = Cells(Rows.Count, 3).End(xlUp).Row 'вычисление последней строки If MyValues(i, 1) = True Then Cells(LastRowNal + 1, 3) = MyValues(i, 2) Next i
'вычисление последней строки в нужном столбце LastRowNal = Cells(Rows.Count, 3).End(xlUp).Row
Worksheets("вывод").Select
'задаем ячейку для вывода значений Set MyRange = Worksheets("вывод").Range(Cells(LastRowNal + 1, 3), Cells(LastRowNal + 1, 3))
'перебираем данные For i = 1 To UBound(MyValues, 2)
If MyValues(1, i) = True Then 'если еще ни одно не перенесено If IsEmpty(MyRange) Then MyRange = MyValues(2, i) 'если уже был перенос значений Else MyRange = MyRange & Chr(44) & Chr(32) & MyValues(2, i) 'добавляем через запятую End If End If
'вычисление последней строки в нужном столбце (здесь 3ий) LastRowNal = Cells(Rows.Count, 3).End(xlUp).Row
Worksheets("вывод").Select
'задаем ячейку для вывода значений Set MyRange = Worksheets("вывод").Range(Cells(LastRowNal + 1, 3), Cells(LastRowNal + 1, 3))
'перебираем данные For i = 1 To UBound(MyValues, 1)
If MyValues(i, 1) = True Then 'если еще ни одно не перенесено If IsEmpty(MyRange) Then MyRange = MyValues(i, 2) 'если уже был перенос значений Else MyRange = MyRange & Chr(44) & Chr(32) & MyValues(i, 2) 'добавляем через запятую End If End If
В приведенном мною коде данные на первом листе остаются без изменений. Чем вам не вариант?
Если настаиваете на своем коде, то добавьте строку: Sheets("Список").Select сразу после For i = 3 To iLastRowNal, тогда будет работать. Но вы просили в одну ячейку и через запятую, а в вашем коде данные добавляются друг под другом и без запятых.
'перебираем данные For i = 1 To UBound(MyValues, 1)
If MyValues(i, 1) = True Then 'если еще ни одно не перенесено If IsEmpty(Worksheets("вывод").Range("C3").Value) Then Worksheets("вывод").Range("C3") = MyValues(i, 2) 'если уже был перенос значений Else Worksheets("вывод").Range("C3") = Worksheets("вывод").Range("C3").Value _ & Chr(44) & Chr(32) & MyValues(i, 2) End If End If
KuklP, все, раз это destination, то вопросов нет. Более менее разобрался. Буду теперь пользоваться. Красиво и лаконично получилось. Спасибо за объяснение!
rSkrin, да, вся таблица должна начинаться с А1 (шапка в вашемслучае). Можно сделать независимо от находжения таблицы, используя свойство CurrentRegion, например. Но тогда перед запуском макроса надо будет выделять какую-нибудь ячейку из таблицы. Первоначально я так и записал макрос. Не знал как для вас проще будет. Если хотите, можно так сделать.
Спасибо! Буду теперь знать и использовать эту функцию. Но хотел бы сначала разобраться. Объясни, пожалуйста, последнее действие: ...copy .Cells(LastRow + 1, 1) Как это работает? Это типа destination? К чему относится точка перед Cells() Почему, вообще, происходит вставка копируемого?
Sub copy_to_archive()
Dim currentRow As Integer
Dim sourceCol As Integer
Dim LastRow As Integer
Dim currentRowValue
Dim sourcews As String
Dim Rowsnum As Integer
sourcews = ActiveSheet.Name 'базовый лист
sourceCol = 5 'Ключевая E колонка
Set myTable = Worksheets(sourcews).Range("A1").CurrentRegion
Rowsnum = myTable.Rows.Count
For currentRow = 5 To Rowsnum 'проверяем есть ли пустые в 5-ой колонке
currentRowValue = Cells(currentRow, sourceCol).Value
If (IsEmpty(currentRowValue) Or currentRowValue = "") Then
MsgBox ("Внимание! Есть пустые ячейки.")
Exit Sub
End If
Next
For currentRow = 5 To Rowsnum 'Копируем
Rows(currentRow).Copy
Worksheets("Архив").Select
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
With Range(Cells(LastRow + 1, 1), Cells(LastRow + 1, 1))
.PasteSpecial Paste:=xlPasteValues
.PasteSpecial Paste:=xlPasteFormats
End With
Worksheets(sourcews).Activate
Next
End Sub
Немного громоздкий макрос получился. Ограничение такое: таблица должны начинаться с ячейки А1. rSkrin, если сойдет, то потом откалибруем под ваши нужды.
Sub zashita_dannyh()
Dim currentRow As Integer
Dim sourceCol As Integer
Dim data As String
sourceCol = 2
RowCount = Cells(1, sourceCol).End(xlDown).Row
RowCount_2 = ActiveSheet.Cells(RowCount, sourceCol).End(xlDown).Row
data = Range(Cells(RowCount, sourceCol), Cells(RowCount, sourceCol)).Value
'проверка на ошибку
For currentRow = RowCount To RowCount_2 - 2
currentRowValue = Cells(currentRow, sourceCol).Value
If Not (IsEmpty(currentRowValue) Or currentRowValue = "") And _
Cells(currentRow + 1, sourceCol).Value <> currentRowValue Then
MsgBox ("даты на лите не совпадают")
Exit Sub
End If
Next
'протектим лист
If Date - DateValue(data) > 1 Then
ActiveSheet.Protect Password:="143" 'пароль 143
End If
End Sub
Хотя, по-моему, без макроса будет даже проще. Пока он настроен так, что его надо запустить на каждом листе, который будет затем защищен.
Sub Copy_rows_if()
Dim currentRow As Integer
Dim sourceCol As Integer
Dim LastRow As Integer
Dim currentRowValue
Dim sourcews As String
sourcews = ActiveSheet.Name 'базовый лист
sourceCol = 2 'колонка B ключевая
RowCount = Cells(Rows.Count, sourceCol).End(xlUp).Row
For currentRow = 1 To RowCount 'для всех строк базового листа
currentRowValue = Cells(currentRow, sourceCol).Value
If Not (IsEmpty(currentRowValue) Or currentRowValue = "") Then
Rows(currentRow).Copy
Worksheets("Финиш").Select
LastRow = Cells(Rows.Count, sourceCol).End(xlUp).Row
Range(Cells(LastRow + 1, 1), Cells(LastRow + 1, 1)).PasteSpecial Paste:=xlPasteValues
Worksheets(sourcews).Activate
End If
Next
End Sub