#excel #vba #csv
#excel #vba #csv
Вопрос:
Я совершенно новичок в VBA и здесь немного потерялся. У меня есть файл Excel с праздниками моих коллег. Для каждого дня года есть ячейка, в которую нужно вставить «X». Мне нужно написать макрос с помощью VBA для экспорта CSV-файла, который экспортирует их номер персонала и дату начала и окончания отпуска. Мне также нужна логика, чтобы пропустить выходные. Мне нужен файл CSV, чтобы импортировать его в Visual Planning. Это должна быть таблица с номером персонала, датой начала и датой окончания в виде столбцов Как я могу это сделать? Не могли бы вы мне помочь, пожалуйста?
Sub Makro1()
‘
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = Worksheets("2021")
Dim ersteZeile As Integer
Dim letzteZeile As Integer
Dim c As Range
Dim datumRow As Integer
Dim d As Range
datumRow = 4
ersteZeile = 5
letzteZeile = ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
anfangsRange = "I" amp; ersteZeile
endrange = "NI" amp; letzteZeile
For Each c In ws.Range("I5:NI71")
If Not c.Value = "" Then
Cells(4, c.Column).Copy Destination:=Sheets("CSV").Column("BEGDA")
End If
Next c
Конец подраздела
Это код, который я получил до сих пор, но мне нужно динамически копировать «X» в мой CSV-лист.
Комментарии:
1. Что вы подразумеваете под «пропуском выходных», если вам нужны только даты начала и окончания? Какой разделитель следует использовать в csv? Вам нужно создать файл для отфильтрованной таблицы или для всех существующих записей? Я упоминаю, что для всех существующих записей это должно быть проще…
2. Пропуская выходные, я имею в виду, что, например, Peter1 имеет отпуск с 11.1.-29.1. но он должен записать номер персонала в мою таблицу CSV с startdate: 11.1., enddate: 15.1., затем еще одну строку в CSV с тем же номером персонала и startdate: 18.1., enddate: 22.1. иитак, мне нужно создать файл для всех существующих записей. Мне нужно перебрать каждую строку и поместить данные в мою таблицу, затем мне нужно экспортировать в формате CSV.
3. ОК. Я подготовлю ответ. Не прямо сейчас, но максимум через час у меня будет немного времени… Я думаю, было бы хорошо, если бы вы попробовали фрагмент кода. В противном случае вы рискуете закрыть свой вопрос…
4. Куда вы хотите экспортировать файл CSV?
Ответ №1:
Пожалуйста, попробуйте следующий код. Он создает строку, соответствующую правилу создания CSV, и помещает ее в файл в конце. Имя файла будет importEmployee.csv
и оно будет найдено в книгах, содержащих этот путь к коду. Вы можете изменить путь в любом месте, которое вам нужно (в конце кода):
Sub ExportCSVHolidayDays()
Dim sh As Worksheet, lastRow As Long, lastCol As Long, arrPn, arrH, arrInt
Dim i As Long, j As Long, strCSV As String, startD As String, endD As String
Dim lngSt As Long, lngEnd As Long, arrI
Set sh = ActiveSheet
lastRow = sh.Range("A" amp; rows.count).End(xlUp).row
lastCol = sh.cells(4, Columns.count).End(xlToLeft).Column
arrPn = sh.Range("A5:A" amp; lastRow).Value
arrH = sh.Range("H4", sh.cells(lastRow, lastCol)).Value
For i = 1 To UBound(arrPn)
arrInt = Application.Index(arrH, i 1, 0) 'extract a row slice of arrH
arrI = Split(StrReverse(Join(arrInt, ",")), ",") 'reverse the slice array
lngSt = WorksheetFunction.Match("X", arrInt, 0) 'first "X" position
startD = arrH(1, lngSt): ' start date (from arrH first row)
lngEnd = UBound(arrI) - WorksheetFunction.Match("X", arrI, 0) 2 'last "X" pos
endD = arrH(1, lngEnd): ' end date (from arrH first row)
If strCSV = "" Then
'write the first row of the CSV string - first employee
strCSV = arrPn(i, 1) amp; "," amp; startD amp; "," amp; endD amp; vbCrLf
Else
'next employee first line
strCSV = strCSV amp; arrPn(i, 1) amp; "," amp; startD amp; "," amp; endD amp; vbCrLf
End If
startD = "": endD = "" 'reinitialize the variables
For j = lngSt To lngEnd 1
If UCase(arrInt(j)) = "X" And startD = "" Then startD = arrH(1, j) 'new start date
If arrInt(j) = "" And endD = "" And startD <> "" Then endD = arrH(1, j - 1) 'new end date
If endD <> "" Then
'write the sequence inside the total start and end date
strCSV = strCSV amp; arrPn(i, 1) amp; "," amp; startD amp; "," amp; endD amp; vbCrLf
End If
If arrInt(j) = "" Then startD = "": endD = "" 'reinitialize the variables
Next
Next
'write the CSV file from string (strCSV):
Dim expPath As String
expPath = ThisWorkbook.Path amp; "importEmployee.csv"
Open expPath For Output As #1
Print #1, strCSV
Close #1
MsgBox "Ready..." amp; vbCrLf amp; _
"Here you can find he CSV exported file: " amp; expPath amp; ".", _
vbInformation, "Finishing confirmation"
End Sub
Пожалуйста, отправьте отзыв после тестирования.
Комментарии:
1. @Engin Topuzoglu: Вы нашли время, чтобы протестировать приведенный выше код?