2015-05-11 2 views
2

Бит новый для VBA. Итак, простите меня, если это довольно просто. Я делаю форму Excel для регистрации различных компаний.Правильное использование функции смещения и для цикла/while

Мой Excel записывает первую колонку (A) в качестве company_name, где нужно указать свое имя_компании.

Колонка C имеет общее количество. сотрудников в компании. (Это включает постоянных + контрактников).

В колонках D и E есть имена сотрудников, которые являются постоянными.

Итак, предположим; Моя колонка C имеет значение 5; столбец (D и E) может иметь 5 или менее 5 названий сотрудников. (Строго не более 5 Имена сотрудников. Если эти столбцы имеют более 5 имен, они должны выдать сообщение об ошибке в листе2)

Следующий мой столбец F обозначает обозначение. Это может иметь значение между 'менеджера', 'Attender', 'Developer', 'Оператор', 'генеральный директор' только и никакое другое значение не допускается. Эти значения могут повторяться слишком (для разных сотрудников, как в изображении ниже)

My_Excel

Для этого я написал ниже код и он работает отлично.

Dim celadr, celval, celadrI, celvalI, celadrN, celvalN As Variant 

Range("F2:F" & LastRow).Select 
    ' Selection.Clearformats 
    For Each cell In Selection 
     celadr = cell.Address 
     celval = cell.Value 
     celadrI = cell.Offset(0, 4).Address 
     celvalI = cell.Offset(0, 4).Value 
     celadrN = cell.Offset(0, 9).Address 
     celvalN = cell.Offset(0, 9).Value 

    If Len(celval) >= 1 Then 
     If InStr(1, ("MANAGER,ATTENDER,DEVELOPER,OPERATOR,CEO,"), Trim(UCase(celval) & ",")) < 1 Then 
      Range(celadr).Interior.Color = vbRed 

      Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & " The Designation is incorrect" 
      strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0) 
      Sheets("Sheet2").Hyperlinks.Add Anchor:=Sheets("Sheet2").Range("A65536").End(xlUp), Address:="", SubAddress:=strstr 

     End If 
    End If  
    Next 

Теперь мое следующее требование; для каждой компании должен быть по крайней мере один «Manager».

Если у определенной компании нет менеджера, тогда я должен предоставить сообщение в «Sheet2» как «Они должны быть по крайней мере одним« Менеджером »для этой компании» со ссылкой на правильные ячейки в листе1.

Я могу проверить его, когда «Менеджер» написан в той же строке, в которой написано имя_компьютера.

Но у меня нет идеи, как это сделать, когда «Менеджер» не написан в той же строке Company_Name.

Ниже приведен мой код, который работает только тогда, когда обозначение - «Менеджер» предполагается записать в той же строке, что и имя_компании.

Range("A2:A" & LastRow).Select 

    For Each cell In Selection 
     celadr = cell.Address 
     celval = cell.Value 
    If Len(celval) >= 1 Then 

      If Trim(cell.Offset(i, 5).Value) <> "Manager" Then 

    cell.Offset(i, 5).Interior.Color = vbRed 

    Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & "Their should be atleast a single 'Manager' for this company" 
    strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0) 
    Sheets("Sheet2").Hyperlinks.Add Anchor:=Sheets("Sheet2").Range("A65536").End(xlUp), Address:="", SubAddress:=strstr 
    End If 

    End If 
    Next 

Я попытался написать код, как показано ниже, чтобы проверить, когда «менеджер» написана на другую строку, чем Company_Name.

(я прокомментировал ту часть, которая дает мне ошибку.)

Range("A2:A" & LastRow).Select 
' Selection.Clearformats 
For Each cell In Selection 
    celadr = cell.Address 
    celval = cell.Value 
If Len(celval) >= 1 Then 
     ' For i = 0 To cell.Offset(0, 2).Value 
     If Trim(cell.Offset(i, 5).Value) <> "Manager" Then 'And cell.Offset(1, 0).Value < 1 Then 
     ' Do Nothing 
' Else 
cell.Offset(i, 5).Interior.Color = vbRed 

Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & "Their should be atleast a single 'Manager' for this company" 
strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0) 
Sheets("Sheet2").Hyperlinks.Add Anchor:=Sheets("Sheet2").Range("A65536").End(xlUp), Address:="", SubAddress:=strstr 
End If 

' Next i 

' If cell.Offset(1, 0).Value >= 1 Then 
' End If 
End If 
Next 

Может кто-нибудь наставит меня, как я могу правильно использовать функцию смещения и для петли/время цикла/найти функцию, чтобы проверить каждую компанию по крайней мере, один менеджер?

ответ

1

Если вы пытаетесь определить, отсутствует ли что-то или нет, то вообще проще установить логическое значение, чтобы использовать его для правильной процедуры.

Это должно помочь вам:

Dim HasManager As Boolean, _ 
    LastRow As Long 
LastRow = ActiveSheet.Range(Rows.Count).End(xlUp).Row 

Range("A2:A" & LastRow).Select 
'Selection.Clearformats 

For Each cell In Selection 
    celadr = cell.Address 
    celval = cell.Value 
    If Len(celval) >= 1 Then 
     HasManager = False 
     'For i = 0 To cell.Offset(0, 2).Value 
     i = 0 
     Do While HasManager = False And _ 
     (cell.Offset(i, 0).Value = "" Or cell.Offset(i, 0).Value = celval) And _ 
     cell.Offset(i, 0).Row <= LastRow + 1 
      If LCase(Trim(cell.Offset(i, 5).Value)) = "manager" Then HasManager = True 
      i = i + 1 
     Loop 

     If HasManager Then 
      'The company has at least one Manager 
     Else 
      'The company doesn't have any Manager 
      cell.Offset(i - 1, 5).Interior.Color = vbRed 

      Sheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0).Value = celval & "Their should be atleast a single 'Manager' for this company" 
      strstr = "'" & shname & "'!" & Range(celadr).Address(0, 0) 
     End If 
    Else 
    End If 
Next cell