#excel
Вопрос:
Я хотел бы использовать excel, чтобы отслеживать, сколько у меня стажеров за каждый месяц на протяжении многих лет.
Имя | Деление | Дата Начала | Дата Окончания |
---|---|---|---|
Анна | Див А | 12 Июня 2019 года | 1 Января 2020 года |
Ben | Div B | 20 октября 2020 года | 20 Декабря 2020 года |
Клэр | Div C | 13 Января 2021 года | 13 Января 2022 года |
Есть ли способ с помощью excel перечислить количество месяцев, в течение которых работает каждый стажер, как показано ниже, чтобы я мог отобразить на графике, сколько стажеров у меня каждый месяц
Месяц/Год | Имя | Div |
---|---|---|
Июнь 2019 | Анна | Див А |
Июль 2019 | Анна | Див А |
Август 2019 года | Анна | Див А |
Сентябрь 2019 | Анна | Див А |
Октябрь 2019 | Анна | Див А |
Ноябрь 2019 | Анна | Див А |
Декабрь 2019 | Анна | Див А |
Январь 2020 года | Анна | Див А |
Октябрь 2020 | Ben | Div B |
Ноябрь 2020 | Ben | Div B |
Декабрь 2020 | Ben | Div B |
Январь 2021 года | Клэр | Div C |
Февраль 2021 года | Клэр | Div C |
Март 2021 года | Клэр | Div C |
Апрель 2021 года | Клэр | Div C |
Май 2021 года | Клэр | Div C |
Июнь 2021 года | Клэр | Div C |
Июль 2021 года | Клэр | Div C |
Август 2021 года | Клэр | Div C |
Сентябрь 2021 года | Клэр | Div C |
Октябрь 2021 года | Клэр | Div C |
Ноябрь 2021 года | Клэр | Div C |
Декабрь 2021 года | Клэр | Div C |
Январь 2022 года | Клэр | Div C |
Ценю любую помощь! Заранее спасибо 🙂
Ответ №1:
Этот код предполагает, что исходные данные находятся при Sheet1
запуске, A1
и помещает результат в столбцы H:J
.
Все это может быть скорректировано в случае необходимости.
Sub ExpandThings()
Dim arrDataIn As Variant
Dim arrDataOut As Variant
Dim idxRow As Long
Dim cnt As Long
Dim idxMonth As Long
With Sheets("Sheet1").Range("A1").CurrentRegion
arrDataIn = .Offset(1).Resize(.Rows.Count - 1)
ReDim arrDataOut(1 To 3, 1 To Application.Max(.Columns(4)) - Application.Min(.Columns(3)))
End With
For idxRow = LBound(arrDataIn, 1) To UBound(arrDataIn, 1)
For idxMonth = 0 To DateDiff("m", arrDataIn(idxRow, 3), arrDataIn(idxRow, 4))
cnt = cnt 1
arrDataOut(1, cnt) = Format(DateAdd("m", idxMonth, arrDataIn(idxRow, 3)), "mmm yyyy")
arrDataOut(2, cnt) = arrDataIn(idxRow, 1)
arrDataOut(3, cnt) = arrDataIn(idxRow, 2)
Next idxMonth
Next idxRow
If cnt > 0 Then
ReDim Preserve arrDataOut(1 To 3, 1 To cnt)
Range("H1").Resize(, 3).Value = Array("Month/Name", "Name", "Div")
Range("H2").Resize(cnt, 3).Value = Application.Transpose(arrDataOut)
End If
End Sub
Комментарии:
1. Привет, Нори, это отлично работает, большое спасибо! Однако у меня есть вопрос к нубу . Не могли бы вы, пожалуйста, объяснить мне эти две строки кода VBA, пожалуйста: Переопределите arrDataOut(от 1 До Ячеек(Строк. Количество, 1).Конец(xlUp). Строка — 1, 1 К Приложению.Макс(.Столбцы(4)) — Приложение.Мин(. Столбцы(3))) Заканчиваются На Для idxRow = От LBound(arrDataIn, 1) До UBound(arrDataIn, 1)
2. Этой первой строки кода нет в коде, который я опубликовал. Вторая строка кода предназначена для циклического перебора строк исходных данных.
3. Я понимаю, спасибо за объяснение. Извините, я отредактировал вторую строку кода, чтобы сделать ее более динамичной
Ответ №2:
Я пытаюсь:
Option Explicit
Option Base 1
Private Const NONSENSE As String = "Nonsense"
Public Sub F()
Dim I As Date
Dim S As String
Dim SwitchMonth As Boolean
Dim M As Integer
Dim D1 As Date
Dim D2 As Date
D1 = "10.10.1990"
D2 = "01.12.1991"
If (D1 > D2) Then
MsgBox ("Failure!")
Exit Sub
End If
M = Month(D1)
MsgBox (OnMonth(M, Year(D1)))
SwitchMonth = False
For I = D1 To D2 Step 1
If Month(I) <> M Then
M = Month(I)
MsgBox (OnMonth(M, Year(I)))
End If
Next
End Sub
Public Function OnMonth(ByVal M As Integer, ByVal Y As Integer) As String
If (M < 1) Or (M > 12) Then
OnMonth = NONSENSE
End If
Select Case M
Case 1
OnMonth = "January"
Case 2
OnMonth = "February"
Case 3
OnMonth = "March"
Case 4
OnMonth = "April"
Case 5
OnMonth = "May"
Case 6
OnMonth = "June"
Case 7
OnMonth = "July"
Case 8
OnMonth = "August"
Case 9
OnMonth = "September"
Case 10
OnMonth = "October"
Case 11
OnMonth = "November"
Case 12
OnMonth = "December"
End Select
OnMonth = OnMonth amp; " " amp; Y
End Function
Ответ №3:
Вы также можете получить изображенные выходные данные с помощью Power Query
, доступных в Windows Excel 2010 и Office 365 Excel
- Выберите какую-нибудь ячейку в исходной таблице
Data => Getamp;Transform => From Table/Range
- Когда откроется пользовательский интерфейс PQ, перейдите к
Home => Advanced Editor
- Обратите внимание на название таблицы в строке 2 кода.
- Замените существующий код на приведенный ниже M-код
- Измените имя таблицы в строке 2 вставленного кода на ваше «настоящее» имя таблицы
- Изучите любые комментарии, а также
Applied Steps
окно, чтобы лучше понять алгоритм и шаги
Также обратите внимание на этот #"Extracted Month Name"
шаг. Это создаст текстовую строку, которую вы видите в таблице результатов. Если вы хотите, чтобы это была «настоящая дата», удалите этот последний шаг из окна «Примененные шаги» и отформатируйте этот столбец на листе Excel для нужного вам внешнего вида
Код M
let
//Read in data
//change table name in next line to reflect actual table name in workbook
Source = Excel.CurrentWorkbook(){[Name="Table16"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,
{{"Name", type text}, {"Division", type text}, {"Start Date", type date}, {"End Date", type date}}),
//create list of dates by month with intervening months (between start and end) = first of the months
#"Added Custom" = Table.AddColumn(#"Changed Type", "Month/Year", each
let
StartDate = #date(Date.Year([Start Date]),Date.Month([Start Date]),1),
EndDate = [End Date],
mnthList = List.Generate(
()=>StartDate,
each _ <= EndDate,
each Date.AddMonths(_, 1)),
//Replace first and last months in the list with the actual date
replLast = List.ReplaceRange(mnthList,List.Count(mnthList)-1,1,{[End Date]}),
replFirst = List.ReplaceRange(replLast,0,1,{[Start Date]})
in
replFirst),
//Remove unneeded columns and move the Month/Year column to the beginning
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Start Date", "End Date"}),
#"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"Month/Year", "Name", "Division"}),
//expand the month list into new rows -- one row for each month
#"Expanded mnthList" = Table.ExpandListColumn(#"Reordered Columns", "Month/Year"),
//Extract the month name and year as a string for display
//Can omit these steps if you want actual months in the cells
// in which case you would format them on the worksheet
#"Extracted Month Name" = Table.TransformColumns(#"Expanded mnthList", {
{"Month/Year", each Date.MonthName(_) amp; " " amp; Text.From(Date.Year(_)), type text}})
in
#"Extracted Month Name"