Почему этот массив работает с одной ячейкой, а не с несколькими? - PullRequest
0 голосов
/ 26 апреля 2018

ОБНОВЛЕНИЕ: Извините, я еще новичок в этом, и я стремлюсь остановить сохранение пользователем рабочего листа до тех пор, пока все «обязательные диапазоны» не будут заполнены на нескольких листах. Вероятно, есть гораздо более простой способ сделать то, что я пытаюсь, но я все еще учусь, извините!

Сообщение об ошибке, которое я получаю с приведенным ниже сообщением «не работает»:

Range(man_cell) = <Method 'Range'of object '_Global' failed>

Это часть макроса «Submit WorkSheet», привязанного к командной кнопке.

Я хочу проверить, все ли ячейки пустые, есть ли во всплывающем окне MessageBox сообщение, что они что-то пропустили Если они не продолжаются как обычно. Когда я использую ссылку на одну ячейку, это работает, когда я использую несколько, это не так. Я установил именованные диапазоны для всех листов, но ни один из них не сработает, и ссылка на одну ячейку работает отлично.

Это работает

man_cells = Array("'Engagement Form'!$I$6")                                             

Это не работает

man_cells = Array("'Engagement Form'!$I$6", "'Engagement Form'!$I$8'")  

Код, который я пытаюсь заставить работать:

'Establish if Mandatory Cells have been completed
Dim man_cells As Variant
Dim man_items_count As Integer

man_cells = Array("'Engagement Form'!$I$6'", _
"'Engagement Form'!$I$8", _
"'Engagement Form'!$B$12:$I$12", _
"'Engagement Form'!$B$16:$I$16", _
"'Engagement Form'!$I$18", "'Engagement Form'!$I$28", "'Engagement Form'!$I$30", "'Engagement Form'!$I$32", "'Engagement Form'!$I$36", _
"'Engagement Form'!$I$38", "'Engagement Form'!$I$40", "'Engagement Form'!$I$44", "'Engagement Form'!$I$46", "'Engagement Form'!$I$48", _
"'Engagement Form'!$I$56", "'Engagement Form'!$I$58", "'Engagement Form'!$I$60", "'Engagement Form'!$I$66", "'Engagement Form'!$I$68", _
"'Engagement Form'!$I$70", "'Engagement Form'!$I$72", "'Engagement Form'!$I$74", "'Engagement Form'!$I$78", "'Engagement Form'!$I$80", _
"'Engagement Form'!$I$82", "'Engagement Form'!$I$88", "'Engagement Form'!$I$96", "'Engagement Form'!$I$98", _
"'Engagement Form'!$B$104:$I$104", _
"'Engagement Form'!$I$106", _
"'Engagement Form'!$B$111:$I$111", _
"'Engagement Form'!$B$115:$I$115", _
"'Engagement Form'!$L$6:$Z$120", _
"'Data Protection Crib Sheet'!$B$9:$B$19", _
"'A & A Crib Sheet'!$B$9:$B$44", _
"'Governance Crib Sheet'!$B$9:$B$17")

CellCount = 0
man_items_count = UBound(man_cells) + 1

For Each man_cell In man_cells

    Set rng = Range(man_cell)
    If Len(rng.Text) > 0 Then
        CellCount = CellCount + 1
    End If
Next man_cell

If CellCount <> man_items_count Then

   MsgBox etc

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Первый комментарий SJR - это исправление вашего вопроса:

у вас слишком много одинарных кавычек в 'Engagement Form'!$I$8'

Второй комментарий упростит ваш код


.

Чтобы минимизировать орфографические ошибки, я предлагаю эту структуру


Option Explicit

Public Sub CheckRequiredCells1()

    Const EM_1 = "I6,I8,B12:I12,B16:I16,I18,I28,I30,I32,I36,I38,I40,I44,I46,I48,"
    Const EM_2 = "I56,I58,I60,I66,I68,I70,I72,I74,I78,I80,I82,I88,I96,I98,"
    Const EM_3 = "B104:I104,I106,B111:I111,B115:I115,L6:Z120"

    Const EM = EM_1 & EM_2 & EM_3   'Required ranges on Sheet "Engagement Form"
    Const DP = "B9:B19"             'Required ranges on Sheet "Data Protection Crib Sheet"
    Const AA = "B9:B44"             'Required ranges on Sheet "A & A Crib Sheet"
    Const GC = "B9:B17"             'Required ranges on Sheet "Governance Crib Sheet"

    Dim wsEM As Worksheet, wsDP As Worksheet, wsAA As Worksheet, wsGC As Worksheet

    Set wsEM = ThisWorkbook.Worksheets("Engagement Form")     'Reference to the sheet
    Set wsDP = ThisWorkbook.Worksheets("Data Protection Crib Sheet")
    Set wsAA = ThisWorkbook.Worksheets("A & A Crib Sheet")
    Set wsGC = ThisWorkbook.Worksheets("Governance Crib Sheet")

    Dim rng As Variant, invalid As Long

    For Each rng In Array(wsEM.Range(EM), wsDP.Range(DP), wsAA.Range(AA), wsGC.Range(GC))
        'rng.Cells.Count = total cells in required range for the sheet being processed
        'Application.WorksheetFunction.CountA(rng) = total cells containing data
        invalid = invalid + (rng.Cells.Count - Application.WorksheetFunction.CountA(rng))
    Next

    If invalid > 0 Then MsgBox "Please fill out all " & invalid & " cells"
End Sub

.

Редактировать

В качестве примера, чтобы добавить новый лист (называемый "Sheet1") с его новым набором диапазонов, добавьте такие строки:

Const S1 = "A1:A2, B3:B5"       'Required ranges on Sheet1

Dim wsS1 As Worksheet

Set wsS1 = ThisWorkbook.Worksheets("Sheet1")

и обновите эту строку в цикле For, включив в нее wsS1.Range(S1):

Array(wsEM.Range(EM), wsDP.Range(DP), wsAA.Range(AA), wsGC.Range(GC), wsS1.Range(S1))

и окончательный код становится:


Const EM_1 = "I6,I8,B12:I12,B16:I16,I18,I28,I30,I32,I36,I38,I40,I44,I46,I48,"
Const EM_2 = "I56,I58,I60,I66,I68,I70,I72,I74,I78,I80,I82,I88,I96,I98,"
Const EM_3 = "B104:I104,I106,B111:I111,B115:I115,L6:Z120"

Const EM = EM_1 & EM_2 & EM_3   'Required ranges on Sheet "Engagement Form"
Const DP = "B9:B19"             'Required ranges on Sheet "Data Protection Crib Sheet"
Const AA = "B9:B44"             'Required ranges on Sheet "A & A Crib Sheet"
Const GC = "B9:B17"             'Required ranges on Sheet "Governance Crib Sheet"
Const S1 = "A1:A2, B3:B5"       '<--- New sheet, with new equired ranges (on Sheet1)

Dim wsEM As Worksheet, wsDP As Worksheet, wsAA As Worksheet, wsGC As Worksheet
Dim wsS1 As Worksheet           '<--- New sheet

Set wsEM = ThisWorkbook.Worksheets("Engagement Form")     'Reference to the sheet
Set wsDP = ThisWorkbook.Worksheets("Data Protection Crib Sheet")
Set wsAA = ThisWorkbook.Worksheets("A & A Crib Sheet")
Set wsGC = ThisWorkbook.Worksheets("Governance Crib Sheet")
Set wsS1 = ThisWorkbook.Worksheets("Sheet1") '<--- New sheet

Dim rng As Variant, invalid As Long

For Each rng In Array(wsEM.Range(EM), wsDP.Range(DP), wsAA.Range(AA), wsGC.Range(GC), _
                      wsS1.Range(S1))
    invalid = invalid + (rng.Cells.Count - Application.WorksheetFunction.CountA(rng))
Next

If invalid > 0 Then MsgBox "Please fill out all " & invalid & " cells"
0 голосов
/ 26 апреля 2018

Вы не можете писать текст в диапазоне ячеек. Он подберет только лен первой ячейки в диапазоне. Это одна из основных проблем.

Ниже приведено количество обработанных ячеек и количество пустых ячеек. Так что проверим, все ли ячейки заполнены. Есть более простые способы работы с диапазонами. Например, создайте именованные диапазоны и используйте их.

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

Option Explicit

Public Sub Test()

    'Establish if Mandatory Cells have been completed
    Dim man_cells As Variant

    man_cells = Array("'Engagement Form'!$I$6'", _
                      "'Engagement Form'!$I$8", _
                      "'Engagement Form'!$B$12:$I$12", _
                      "'Engagement Form'!$B$16:$I$16", _
                      "'Engagement Form'!$I$18", "'Engagement Form'!$I$28", "'Engagement Form'!$I$30", "'Engagement Form'!$I$32", "'Engagement Form'!$I$36", _
                      "'Engagement Form'!$I$38", "'Engagement Form'!$I$40", "'Engagement Form'!$I$44", "'Engagement Form'!$I$46", "'Engagement Form'!$I$48", _
                      "'Engagement Form'!$I$56", "'Engagement Form'!$I$58", "'Engagement Form'!$I$60", "'Engagement Form'!$I$66", "'Engagement Form'!$I$68", _
                      "'Engagement Form'!$I$70", "'Engagement Form'!$I$72", "'Engagement Form'!$I$74", "'Engagement Form'!$I$78", "'Engagement Form'!$I$80", _
                      "'Engagement Form'!$I$82", "'Engagement Form'!$I$88", "'Engagement Form'!$I$96", "'Engagement Form'!$I$98", _
                      "'Engagement Form'!$B$104:$I$104", _
                      "'Engagement Form'!$I$106", _
                      "'Engagement Form'!$B$111:$I$111", _
                      "'Engagement Form'!$B$115:$I$115", _
                      "'Engagement Form'!$L$6:$Z$120", _
                      "'Data Protection Crib Sheet'!$B$9:$B$19", _
                      "'A & A Crib Sheet'!$B$9:$B$44", _
                      "'Governance Crib Sheet'!$B$9:$B$17")

    Dim i As Long, numberBlanks As Long, numberOfCells As Long

    For i = LBound(man_cells) To UBound(man_cells)
        numberBlanks = numberBlanks + Application.WorksheetFunction.CountBlank(ThisWorkbook.Worksheets(Split(man_cells(i), "'")(1)).Range(Split(Split(man_cells(i), "!")(1), "'")(0)))
        numberOfCells = numberOfCells + ThisWorkbook.Worksheets(Split(man_cells(i), "'")(1)).Range(Split(Split(man_cells(i), "!")(1), "'")(0)).Cells.Count
    Next i

    If numberBlanks <> numberOfCells Then MsgBox "Etc"
End Sub

Отмена сохранения пользователя:

Если вы хотите, чтобы это прекратило сохранение пользователя, вы можете включить его в качестве вызова функции из события Workbook_BeforeSave, например,

Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
        Cancel As Boolean)

    If CancelSave = True Then Cancel = True
End Sub

Public Function CancelSave() As Boolean

    Dim man_cells As Variant

    man_cells = Array("'Engagement Form'!$I$6'", _
                      "'Engagement Form'!$I$8", _
                      "'Engagement Form'!$B$12:$I$12", _
                      "'Engagement Form'!$B$16:$I$16", _
                      "'Engagement Form'!$I$18", "'Engagement Form'!$I$28", "'Engagement Form'!$I$30", "'Engagement Form'!$I$32", "'Engagement Form'!$I$36", _
                      "'Engagement Form'!$I$38", "'Engagement Form'!$I$40", "'Engagement Form'!$I$44", "'Engagement Form'!$I$46", "'Engagement Form'!$I$48", _
                      "'Engagement Form'!$I$56", "'Engagement Form'!$I$58", "'Engagement Form'!$I$60", "'Engagement Form'!$I$66", "'Engagement Form'!$I$68", _
                      "'Engagement Form'!$I$70", "'Engagement Form'!$I$72", "'Engagement Form'!$I$74", "'Engagement Form'!$I$78", "'Engagement Form'!$I$80", _
                      "'Engagement Form'!$I$82", "'Engagement Form'!$I$88", "'Engagement Form'!$I$96", "'Engagement Form'!$I$98", _
                      "'Engagement Form'!$B$104:$I$104", _
                      "'Engagement Form'!$I$106", _
                      "'Engagement Form'!$B$111:$I$111", _
                      "'Engagement Form'!$B$115:$I$115", _
                      "'Engagement Form'!$L$6:$Z$120", _
                      "'Data Protection Crib Sheet'!$B$9:$B$19", _
                      "'A & A Crib Sheet'!$B$9:$B$44", _
                      "'Governance Crib Sheet'!$B$9:$B$17")

    Dim i As Long, numberBlanks As Long, numberOfCells As Long

    For i = LBound(man_cells) To UBound(man_cells)
        numberBlanks = numberBlanks + Application.WorksheetFunction.CountBlank(ThisWorkbook.Worksheets(Split(man_cells(i), "'")(1)).Range(Split(Split(man_cells(i), "!")(1), "'")(0)))
        numberOfCells = numberOfCells + ThisWorkbook.Worksheets(Split(man_cells(i), "'")(1)).Range(Split(Split(man_cells(i), "!")(1), "'")(0)).Cells.Count
    Next i

    If numberBlanks > 0 Then
        MsgBox "Please complete all mandatory cells"
        CancelSave = True
    End If
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...