Войти

Показать полную графическую версию : Нужна помощь с макросом в Excel


Brainiacs
07-09-2021, 23:29
Доброго времени!

Просьба помочь с макросом в Excel.

Исходные данные:

Из программы контроля доступа в офис, выгружаю отчёт см. report4.xlsx, так же я там пометил, как хотелось бы чтобы макрос отрабатывал (зеленым) и как выгружается по умолчанию (черным).

Есть столбец "Name" в формате "Текст" вида "ИмяФамилияСотрудника" (в примере, заменил имена на цифры, не суть)
и столбец "Time" в формате "Текст" вида "2021-09-01 09:31:27"

Задача:

"Разбивать" каждого сотрудника по дням пустой строкой.

megaloman
08-09-2021, 00:43
Sub InBlanc()

Set rID1 = Range("A4") 'Первая ячейка с Person Id
Set rDT1 = Range("D4") 'Первая ячейка с Time

PersonID = rID1
DPerson = Mid(rDT1, 1, 10)

j = rID1.Row + 1
i = 1
Do
TPerson = rID1.Offset(i, 0)
If Trim(TPerson) = "" Then Exit Do
TDperson = Mid(rDT1.Offset(i, 0), 1, 10)

If Not (PersonID = TPerson And DPerson = TDperson) Then
Rows(CStr(j)).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
i = i + 1
j = j + 1
PersonID = TPerson
DPerson = TDperson
End If
i = i + 1
j = j + 1
Loop

End Sub
ИМХО, будет удобнее написать скрипт на VBS и отправлять на него таблицу с выгруженными данными.

megaloman
08-09-2021, 08:00
InXls = "D:\Мой контент\Загрузки\report4.xlsx" 'имя исходного Excel-файла

srID1 = "A4" 'Первая ячейка с Person Id
srDT1 = "D4" 'Первая ячейка с Time

With WScript.Arguments
If .Count > 0 Then InXls = .Item(0)
End With

If Not CreateObject("Scripting.FileSystemObject").FileExists(InXls) Then
MsgBox "Файл:" + vbCrLf + InXls + vbCrLf + "не найден"
WScript.Quit 1
End If

With CreateObject("Excel.Application")
.Visible = True 'True ' False
.Workbooks.Open InXls
InBook = .ActiveWorkbook.Name
InList = .Workbooks(InBook).ActiveSheet.Name

PersonID = .Range(srID1)
DPerson = Mid(.Range(srDT1), 1, 10)

j = .Range(srID1).Row + 1
i = 1

Do
TPerson = .Range(srID1).Offset(i, 0)
If Trim(TPerson) = "" Then Exit Do
TDperson = Mid(.Range(srDT1).Offset(i, 0), 1, 10)

If Not (PersonID = TPerson And DPerson = TDperson) Then
.Rows(CStr(j)).Insert -4121, 0
i = i + 2
j = j + 2
PersonID = TPerson
DPerson = TDperson
Else
i = i + 1
j = j + 1
End If
Loop
End With
В скрипте имя файла можно указать явно. А можно на рабочем столе сохранить этот скрипт или создать на него значок, чтобы затем в проводнике мышкой затягивать на него файл.

Brainiacs
08-09-2021, 09:07
Большое спасибо, megaloman!!! (С меня пиво, можешь в личку присылать, куда отправлять)

Очень выручил макрос работает отлично, но у меня правда там ещё пару строк ('Delete columns from G to J и 'Replace name of cells, а дальше это твоё), когда будет время подскажешь как их в скрипт закинуть?!

Sub Macro1()
'
' Macro1 Macro
'

'Delete columns from G to J
Columns("G:J").Delete

'Replace name of cells
Cells.Replace What:="GlavniUlaz_Door1_Entrance Card Reader1", Replacement:= _
"Entrance Card Reader1", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase _
:=False, SearchFormat:=False, ReplaceFormat:=False, FormulaVersion:= _
xlReplaceFormula2

Cells.Replace What:="GlavniUlaz_Door1_Exit Card Reader2", Replacement:= _
"Exit Card Reader2", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase _
:=False, SearchFormat:=False, ReplaceFormat:=False, FormulaVersion:= _
xlReplaceFormula2


Set rID1 = Range("A4") 'First cell Person Id
Set rDT1 = Range("D4") 'First cell Time

PersonID = rID1
DPerson = Mid(rDT1, 1, 10)

j = rID1.Row + 1
i = 1
Do
TPerson = rID1.Offset(i, 0)
If Trim(TPerson) = "" Then Exit Do
TDperson = Mid(rDT1.Offset(i, 0), 1, 10)

If Not (PersonID = TPerson And DPerson = TDperson) Then
Rows(CStr(j)).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
i = i + 1
j = j + 1
PersonID = TPerson
DPerson = TDperson
End If
i = i + 1
j = j + 1
Loop
'
End Sub

megaloman
08-09-2021, 13:58
но у меня правда там ещё пару строк »
Sub InBlanc()

Set rID1 = Range("A4") 'Первая ячейка с Person Id
Set rDT1 = Range("D4") 'Первая ячейка с Time

MyDel = "G:J" 'Удаляемые столбцы
'Контекстное переименование
MyRepl = Array("GlavniUlaz_Door1_Entrance Card Reader1", "Entrance Card Reader1", _
"GlavniUlaz_Door1_Exit Card Reader2", "Exit Card Reader2")

Call Range(MyDel).Delete(-4159)
For i = LBound(MyRepl) To UBound(MyRepl) Step 2
Call Cells.Replace(MyRepl(i), MyRepl(i + 1), 2, 1)
Next

PersonID = rID1
DPerson = Mid(rDT1, 1, 10)

j = rID1.Row + 1
i = 1
Do
TPerson = rID1.Offset(i, 0)
If Trim(TPerson) = "" Then Exit Do
TDperson = Mid(rDT1.Offset(i, 0), 1, 10)

If Not (PersonID = TPerson And DPerson = TDperson) Then
Rows(CStr(j)).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
i = i + 2
j = j + 2
PersonID = TPerson
DPerson = TDperson
Else
i = i + 1
j = j + 1
End If
Loop
End Sub
InXls = "D:\Мой контент\Загрузки\report4.xlsx" 'имя исходного Excel-файла
srID1 = "A4" 'Первая ячейка с Person Id
srDT1 = "D4" 'Первая ячейка с Time

MyDel = "G:J" 'Удаляемые столбцы
'Контекстное переименование
MyRepl = Array("GlavniUlaz_Door1_Entrance Card Reader1", "Entrance Card Reader1", _
"GlavniUlaz_Door1_Exit Card Reader2", "Exit Card Reader2")

With CreateObject("Excel.Application")
.Visible = True 'True ' False
.Workbooks.Open InXls

Call .Range(MyDel).Delete(-4159)
For i = LBound(MyRepl) To UBound(MyRepl) Step 2
Call .Cells.Replace(MyRepl(i), MyRepl(i + 1), 2, 1)
Next

PersonID = .Range(srID1)
DPerson = Mid(.Range(srDT1), 1, 10)

j = .Range(srID1).Row + 1
i = 1

Do
TPerson = .Range(srID1).Offset(i, 0)
If Trim(TPerson) = "" Then Exit Do
TDperson = Mid(.Range(srDT1).Offset(i, 0), 1, 10)

If Not (PersonID = TPerson And DPerson = TDperson) Then
.Rows(CStr(j)).Insert -4121, 0
i = i + 2
j = j + 2
PersonID = TPerson
DPerson = TDperson
Else
i = i + 1
j = j + 1
End If
Loop
End With
End Sub
InXls = "D:\Мой контент\Загрузки\report4.xlsx" 'имя исходного Excel-файла
srID1 = "A4" 'Первая ячейка с Person Id
srDT1 = "D4" 'Первая ячейка с Time

MyDel = "G:J" 'Удаляемые столбцы
'Контекстное переименование
MyRepl = Array("GlavniUlaz_Door1_Entrance Card Reader1", "Entrance Card Reader1", _
"GlavniUlaz_Door1_Exit Card Reader2", "Exit Card Reader2")

With WScript.Arguments
If .Count > 0 Then InXls = .Item(0)
End With

If Not CreateObject("Scripting.FileSystemObject").FileExists(InXls) Then
MsgBox "Файл:" + vbCrLf + InXls + vbCrLf + "не найден"
WScript.Quit 1
End If

With CreateObject("Excel.Application")
.Visible = True 'True ' False
.Workbooks.Open InXls

Call .Range(MyDel).Delete(-4159)
For i = LBound(MyRepl) To UBound(MyRepl) Step 2
Call .Cells.Replace(MyRepl(i), MyRepl(i + 1), 2, 1)
Next

PersonID = .Range(srID1)
DPerson = Mid(.Range(srDT1), 1, 10)

j = .Range(srID1).Row + 1
i = 1

Do
TPerson = .Range(srID1).Offset(i, 0)
If Trim(TPerson) = "" Then Exit Do
TDperson = Mid(.Range(srDT1).Offset(i, 0), 1, 10)

If Not (PersonID = TPerson And DPerson = TDperson) Then
.Rows(CStr(j)).Insert -4121, 0
i = i + 2
j = j + 2
PersonID = TPerson
DPerson = TDperson
Else
i = i + 1
j = j + 1
End If
Loop
End With




© OSzone.net 2001-2012