0 / 0 / 0
Регистрация: 01.10.2021
Сообщений: 4
|
|
1 | |
Макрос для переноса данных из одного документа Excel в другой01.10.2021, 13:55. Показов 614. Ответов 4
Метки нет (Все метки)
Добрый день. Есть 2 системы которые формируют отчеты ("Отчет1.xls", "Отчет2.xls") прихода\ухода на работу. Необходимо с помощью макроса переносить данные (время прихода\ухода) с привязками к дате и ФИО в другой документ excel (табель рабочего времени за месяц "Учет рабочего времени.xlsm"). Для одного из отчетов "Отчет1.xls" есть готовый макрос. Проблема состоит в макросе для "Отчет2.xls" на сколько я понял из-за того что столбец Даты в отчете в формате "Дата", а при изменении формата на "Текстовый" вместо 01.09.2021 появляется 44440. Можете помочь с кодом макроса для переноса данных из "Отчет2.xls" в "Учет рабочего времени.xlsm"
Код
Option Explicit Const SKUD_XLSX = "Отчет1.xls" Const TABL_XLSX = "Учет рабочего времени.xlsx" Sub СКУДвТабель() Dim wbS As Workbook Dim wbT As Workbook On Error Resume Next Set wbS = Workbooks("Отчет1.xls") Set wbT = Workbooks("Учет рабочего времени.xlsx") On Error GoTo 0 If wbS Is Nothing Then MsgBox "Не найден файл " & SKUD_XLSX, vbInformation Else If wbT Is Nothing Then MsgBox "Не найден файл " & TABL_XLSX, vbInformation Else Dim arrSkud As Variant arrSkud = GetArrSkud(wbS.Sheets(1)) Dim dicY As Object Dim dicX As Object GetDic wbT.Sheets(1), dicY, dicX PrintResult wbT.Sheets(1), wbS.Sheets(1), arrSkud, dicY, dicX End If End If End Sub Sub PrintResult(sh As Worksheet, shSKUD As Worksheet, arrSkud As Variant, dicY As Object, dicX As Object) Dim Application_Calculation As Long Application_Calculation = Application.Calculation Application.Calculation = xlCalculationManual Application.EnableEvents = False With sh Dim rep As Variant ReDim rep(1 To UBound(arrSkud, 1), 1 To 1) Dim i As Byte Dim x As Integer Dim y As Long Dim ySkud As Long For ySkud = 1 To UBound(arrSkud, 1) If arrSkud(ySkud, 1) <> "" Then rep(ySkud, 1) = "-" If dicY.Exists(arrSkud(ySkud, 1)) Then If dicX.Exists(arrSkud(ySkud, 2)) Then rep(ySkud, 1) = "+" y = dicY.Item(arrSkud(ySkud, 1)) x = dicX.Item(arrSkud(ySkud, 2)) For i = 0 To 1 If arrSkud(ySkud, 5 + i) <> "" Then .Cells(y, x + i).Value = arrSkud(ySkud, 5 + i) End If Next End If End If End If Next End With shSKUD.Cells(1, 15).Resize(UBound(rep, 1), UBound(rep, 2)) = rep Application.EnableEvents = True Application.Calculation = Application_Calculation End Sub Function GetArrSkud(sh As Worksheet) With sh Dim arr As Variant Dim y As Long y = .Cells(.Rows.Count, 3).End(xlUp).Row GetArrSkud = .Range(.Cells(1, 3), .Cells(.Cells(.Rows.Count, 3).End(xlUp).Row, 8)) End With End Function Sub GetDic(sh As Worksheet, dicY As Object, dicX As Object) With sh Dim arr As Variant Dim y As Long y = .Cells(.Rows.Count, 2).End(xlUp).Row arr = .Range(.Cells(1, 2), .Cells(y, 2 - (y = 1))) Set dicY = CreateObject("Scripting.Dictionary") For y = 1 To UBound(arr, 1) Select Case arr(y, 1) Case "", "ФИО" Case Else dicY.Item(arr(y, 1)) = y End Select Next y = .Cells(2, .Columns.Count).End(xlToLeft).Column arr = .Range(.Cells(2, 1), .Cells(2 - (y = 1), y)) Set dicX = CreateObject("Scripting.Dictionary") For y = 1 To UBound(arr, 2) Select Case arr(1, y) Case "", "№ п/п", "ФИО", "Отдел" Case Else dicX.Item(CStr(arr(1, y))) = y End Select Next End With End Sub
0
|
01.10.2021, 13:55 | |
Ответы с готовыми решениями:
4
Макрос для переноса данных из одного Excel в другой Excel файл Нужен макрос для переноса данных с одного файла excel в другой Макрос переноса данных из одного документа в другой Макрос для переноса выделенных ячеек из одного листа документа в другой Макрос для переноса данных с одного файла в другой |
0 / 0 / 0
Регистрация: 01.10.2021
Сообщений: 4
|
|
01.10.2021, 14:03 [ТС] | 2 |
Не сразу нашел вложения
0
|
малоболт
1317 / 500 / 212
Регистрация: 30.01.2020
Сообщений: 1,220
|
|
01.10.2021, 15:35 | 3 |
utpvlad, дело в том, что MS Office хранит дату в ячейке в виде числа дней, прошедших с 31/12/1899. Соответственно, если в какую-то ячейку вбить дату, а потом поменять формат этой ячейки на Числовой или Текстовый, значение в ячейке предстанет в своём истинном обличии - просто число.
Если дату скопировать и вставить в ячейку с форматом отличным от формата Дата (например Общий, стоящий по умолчанию), то вполне вероятно увидеть в ячейке не дату, а то самое число дней. Для того, чтобы это не происходило, нужно самому, перед вставкой даты, поменять формат отображения ячейки именно на дату, и только потом вставлять в неё. Либо, если нужно, чтобы в ячейке отображались текстовое значение, а вам надо туда вставить дату, надо воспользоваться функцией Cstr(дата).
0
|
0 / 0 / 0
Регистрация: 01.10.2021
Сообщений: 4
|
|
01.10.2021, 17:20 [ТС] | 4 |
Этот Отчет1 с таким форматом столбца даты "Дата" формирует WorkTime Server, в то время как с ZKAccess Отчет2 с форматом столбца даты "Общий" и на сколько я понял именно в этом заключается проблема не работы данного макроса написанного для переноса данных с отчета ZKAccess. Может есть вариант переноса данных не с Excel а с Word документа?
0
|
549 / 479 / 191
Регистрация: 11.12.2013
Сообщений: 2,499
|
|
01.10.2021, 18:59 | 5 |
попробую сделать в понедельник если никто не сделает
0
|
01.10.2021, 18:59 | |
01.10.2021, 18:59 | |
Помогаю со студенческими работами здесь
5
Макрос для переноса (с удалением) данных с одного листа на другой при появлении дополнительных данных в ячейке Очень нужен макрос для переноса данных из одного файла в другой, с поиском значений Макрос для выборочного переноса из одного листа в другой Макрос для переноса данных из Excel в Word Макрос для переноса данных из Excel в Word Макрос для переноса данных в виде таблицы из Excel в Word Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |