2015-03-04 3 views
0

Я не смог понять, почему блок For Loop (с двумя циклами) пропускается кодом. Я знаю, что это пропущено bc, окно сообщения сработает дальше в коде. Есть предположения?Для прохода Loop Over

Dim OL As Outlook.Application 
Dim myitem As Outlook.MailItem 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim PicPath As String 
Dim x, y As Integer 
Dim Name As Name 
Dim cell, rng1 As Range 


Set wb = ActiveWorkbook 
Set ws = wb.Sheets("Sheet1") 

wb.Sheets("Sheet1").Activate 

'Request type check 
If (Sheet1.NewResource.Value = False) And (Sheet1.Modification.Value = False) Then 
    MsgBox "Please select a Request Type of your request and complete the other mandatory fields" 
    GoTo cont 
End If 

'checking New Resource Entry mandatory fields 
If Sheet1.NewResource.Value = True Then 

    If (Sheet1.NewPOnobx.Value = False) And (Sheet1.NewPOyesbx.Value = False) Then 
     MsgBox "Please fill the missing mandatory fields" 
     GoTo cont 
    End If 

    If (Sheet1.POyesbx.Value = False) And (Sheet1.POnobx.Value = False) Then 
     MsgBox "Please fill the missing mandatory fields" 
     GoTo cont 
    End If 

    If (Sheet1.POnobx.Value = True) And (Sheet1.SOWtxt.Value = "") Then 
     MsgBox "Please select a copy of the Signed Agreement" 
     GoTo cont 
    End If 

    For Each Name In ActiveWorkbook.Names 'each named range in gateway fields 
     If (Name = "C_LN") Or (Name = "C_FN") Or (Name = "C_SD") Or (Name = "C_ED") Or (Name = "C_O") Or (Name = "C_D") Or (Name = "C_OF") Or (Name = "C_C") Or (Name = "C_M") Or _ 
     (Name = "C_R") Or (Name = "C_PT") Or (Name = "C_V") Or (Name = "C_SAR") Or (Name = "C_BAR") Or (Name = "C_SR") Or (Name = "C_SS") Or (Name = "C_PO") Then 'all gateway field names 
      x = 0 
      For Each cell In Name 'cell in the named range 
       If cell.Value = "" Then 'looking for blank mandatory fields 
        If (cell.Name = "LN_Cmt") Or (cell.Name = "FN_Cmt") Or (cell.Name = "SD_Cmt") Or (cell.Name = "ED_Cmt") Or (cell.Name = "O_Cmt") Or _ 
        (cell.Name = "D_Cmt") Or (cell.Name = "OF_Cmt") Or (cell.Name = "C_Cmt") Or (cell.Name = "M_Cmt") Or (cell.Name = "R_Cmt") Or _ 
        (cell.Name = "PT_Cmt") Or (cell.Name = "V_Cmt") Or (cell.Name = "SAR_Cmt") Or (cell.Name = "BAR_Cmt") Or (cell.Name = "SR_Cmt") Or _ 
        (cell.Name = "SS_Cmt") Or (cell.Name = "PO_Cmt") Then 
         GoTo skip1 
        Else 
         x = x + 1 '+1 for a blank mandatory field 
        End If 
       End If 
skip1: 
      Next cell 

       If x > 0 Then 'flag the missing info 
        MsgBox "Please fill the missing mandatory fields" 
        GoTo cont 
       End If 

      End If 
     Next Name 

End If 
+0

'Я знаю, что пропуску Ьс сообщение box' - это не хорошо, пожалуйста, используйте отладчик. Ключ «F8». – GSerg

+2

Что делает GoTo Skip1? Попробуйте прокомментировать это и посмотрите, все ли работает лучше. (Имея пустое действие THEN до ELSE, оно является законным.) Заявления GoTo могут испортить вещи, и это не служит очевидной цели. Определенно используйте отладчик - поместите красный знак «Стоп» в левый столбец, а затем F8 t перейдите через свой код, чтобы узнать, что происходит. –

+0

Цель Skip1 - пропустить счетчик переменных x и перейти к следующей ячейке. – James

ответ

1

Для меня Name в цикле for дает что-то вроде =Sheet1!$G$2:$G$5 ... это не соответствует вашему C_R или тому подобное. Мне нужно использовать Name.Name, чтобы получить это. И затем, чтобы получить диапазон ячеек для имени, мне нужно использовать Name.RefersToRange.

Кроме того, чтобы сделать ваш If список проще в управлении, вы могли бы использовать Select Case вместо:

Select Case Name.Name 
    Case "C_LN", "C_FN", "C_SD", "C_ED", "C_O", "C_D", "C_OF", "C_C", "C_M", "C_R", "C_PT", "C_V", "C_SAR", "C_BAR", "C_SR", "C_SS", "C_PO" 
     For Each cell In Name.RefersToRange 
     Debug.Print cell.Address 
     Next cell 
    Case Else 
     Debug.Print "Other Name" 
    End Select 
0

Не используйте имя, это зарезервированное слово (вы можете переименовывать файлы с именем File1 в качестве файла2).

Изменить имя переменной на MyName или что-то подобное, если вы продолжаете испытывать проблему, поставьте стоп на код и оцените цикл вручную в ветре отладки (CTRL-G), набрав? Activeworkbook.Names.Count и нажмите enter (не забывайте?) и посмотрите, есть ли у вас число выше нуля.

+0

«Имя» - это ключевое слово, зависящее от контекста. Это ключевое слово в разделе «Имя ... как ...», а не ключевое слово в другом месте. Это нормально иметь переменную с именем 'Name'. Вы даже можете «Name Name As Name». – GSerg

+0

Имя Имя как Имя ...... Вы понимаете, что вы только что взорвали мой слабый ум;) –