Member 13030664 Ответов: 1

Как рассчитать общее количество часов в соответствии с именем и регионом в скрипте VB


REGION	EMPLOYEE  hR	HR	HR	
US	BOB	  1	2	1
UK	BOB	  5	1	0
US	TOM	  7	5	5
UK	TOM	  6	1	1
US	BOB	  1	5	4
UK	TOM	  4	8	2
US	BOB	 10	24	5
UK	TOM	 12	15	2


Это и есть данные. Я хочу добавить общее количество часов, отработанных каждым сотрудником в зависимости от региона. Я не могу сортировать данные по регионам. Новый скрипт на VBA. заранее спасибо

Что я уже пробовал:

Private Sub CommandButton2_Click()
Dim employee As String, region As String, total As Integer, sheet As Worksheet, i As Integer
total = 0
For Each sheet In Worksheets
employee = InputBox("enter name")
region = InputBox("enter region")

For i = 2 To 9
If sheet.Cells(i, 1).Value = US Then
If sheet.Cells(i, 2).Value = employee Then
    total = total + sheet.Cells(i, 3).Value + sheet.Cells(i, 4).Value + sheet.Cells(i, 5).Value
End If
End If
 Next i
Next sheet
MsgBox "Total Hours of " & employee & " is " & total

End Sub

Richard MacCutchan

Сначала вам нужно выполнить сортировку, а затем использовать промежуточные итоги, чтобы получить различные итоговые значения.

Richard MacCutchan

Используйте функцию записи макросов Excel и выполните сортировку данных. Это даст вам код VBA, который вам нужен.

1 Ответов

Рейтинг:
0

Maciej Los

Предположим, что ваши данные помещены в диапазон "A1:E9", вы должны объединить несколько методов, чтобы получить общую сумму для сотрудника в конкретном регионе. Пожалуйста, смотрите:

Option Explicit

Private Sub CommandButton2_Click()
Dim sEmployee As String, sRegion As String
Dim sEmployeeColumn As String, sRegionColumn As String, sHrsColumn As String
Dim total As Integer, i As Integer, sMyFormula As String
Dim wsh As Worksheet, rng As Range

total = 0

Do While sEmployee = "" Or sRegion = ""
    sEmployee = UCase(InputBox("Enter name:", "Enter Employee name"))
    sRegion = UCase(InputBox("Enter region:", "Enter Region name"))
    total = total + 1
    If total = 3 Then
        MsgBox "You skipped entering data 3 times.", vbInformation, "Finish..."
        GoTo Exit_CommandButton2_Click
    End If
Loop

total = 0
Set wsh = ThisWorkbook.Worksheets("Arkusz1")
Set rng = wsh.UsedRange 'or wsh.Range("A5:E55")
sEmployeeColumn = rng.Columns("B").Address & "=""" & sEmployee & """"
sRegionColumn = rng.Columns("A").Address & "=""" & sRegion & """"
For i = 2 To 4
    'sum HR columns
    sHrsColumn = rng.Columns("A:A").Offset(0, i).Address
    'formula array
    sMyFormula = "=SUM(IF((" & sRegionColumn & ")*(" & sEmployeeColumn & ")," & sHrsColumn & ",0))"
    'insert formula one row below the range
    rng.End(xlDown).Offset(1, i).Cells(1, 1).FormulaArray = sMyFormula
    'get total
    total = total + WorksheetFunction.Sum(rng.End(xlDown).Offset(1, i).Cells(1, 1))
    'remove temporary data
    rng.End(xlDown).Offset(1, i).Cells(1, 1).Delete xlShiftUp
Next i

MsgBox "Total Hours of '" & sEmployee & "' (region: '" & sRegion & "') is: " & total
 
Exit_CommandButton2_Click:
    'ignore errors
    On Error Resume Next
    'clean up
    Set wsh = Nothing
    Set rng = Nothing
    Exit Sub

Err_CommandButton2_Click:
    MsgBox Err.Description, vbExclamation, Err.Number
    Resume Exit_CommandButton2_Click
 
End Sub