Dzień dobry wszystkim

Jestem trochę zardzewiały na moim VBA, ponieważ przeniosłem się na programowanie w innych językach, więc miałem nadzieję, że ktoś będzie w stanie mi pomóc.

, co próbuję zrobić

Mam dwa arkusze. Jedna jest strona formularza, którą użytkownicy wypełnią, drugą (arkusz1 .... Nie nazwałę go) jest zasadniczo stroną danych.

W obrębie arkusza1 mam tabelę, która pokazuje 1 lub 0 w zależności od, jeśli zakres w formularzu ma określony wybór. Dwie kolumny o wartości komórki stanowi zakres, który potrzebuje komunikatu wejściowego. Makro ma znaleźć wszystkie 1's, wyszukiwanie nazwanego zakresu znalazł dwie kolumny i włóż nazwany zakres. Niestety, przytrzymując błąd aplikacji lub określony obiekt. Mój kod jest poniżej:

PcentData = Sheets("Sheet1").Range("PcentData").Value
    If PcentData > 0 Then
        For Each pCell In Sheets("Sheet1").Range("PcentSwitch")
            If pCell.Value = 1 Then
                With Sheets("Payment-Deduction Form").Range(Cells(pCell.Row, pCell.Column + 2)).Validation 'Error here
                .Add Type:=xlValidateInputOnly
                .InputTitle = "Test"
                .InputMessage = "Test"

                End With
            End If

        Next pCell
    End If

EDYTOWAĆ:

Udało mi się upewnić się, że kod wyciąga nazwany zakres z prawidłowego arkusza, definiując ciąg zwany Namedrange i mając go równe stare z instrukcją, wskazując na prawidłowy arkusz.

Dim NamedRange As String
PcentData = Sheets("Sheet1").Range("PcentData").Value
    If PcentData > 0 Then
        For Each pCell In Sheets("Sheet1").Range("PcentSwitch")
            If pCell.Value = 1 Then
                NamedRange = Sheets("Sheet1").Cells(pCell.Row, pCell.Column + 2).Value
                MsgBox (Sheets("Sheet1").Cells(pCell.Row, pCell.Column + 2).Value)
                With Sheets("Payment-Deduction Form").Range(NamedRange)
                    If .Validation Then .Validation.Delete
                    .Validation.Add /* Error Here */ Type:=xlValidateInputOnly
                    .InputTitle = "Test"
                    .InputMessage = "Test"
                End With
            End If

        Next pCell
    End If

Niestety dostaję obiekt błędu nie obsługuje tej właściwości lub metody w sekcji Vvalidaation.

1
JaayB 16 luty 2017, 15:19

2 odpowiedzi

Najlepsza odpowiedź

Z pomocą Vityata udało mi się znaleźć rozwiązanie mojego problemu. Problemem była oryginalna pętla, którą zajmował stanowisko tabeli, którą chciałem znaleźć z niewłaściwego arkusza. Przechowałem to w zmiennej nazwie "Namedrange" i podłączyłem to do oświadczenia zamiast próbować go wprowadzić bezpośrednio do zasięgu ().

Kolejnym problemem była walidacja danych. Wygląda na to, że nie lubi mieć oddzielone Oto kod pracy:

Dim NamedRange As String
PcentData = Sheets("Sheet1").Range("PcentData").Value

    If PcentData > 0 Then
        For Each pCell In Sheets("Sheet1").Range("PcentSwitch")
            If pCell.Value = 1 Then
                NamedRange = Sheets("Sheet1").Cells(pCell.Row, pCell.Column + 2).Value
                With ThisWorkbook.Sheets("Payment-Deduction Form").Range(NamedRange).Validation
                    .Delete
                    .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
                    :=xlBetween
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = "test"
                    .ErrorTitle = ""
                    .InputMessage = "test"
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
            End If

        Next pCell
    End If

Dzięki za pomoc!

0
JaayB 17 luty 2017, 10:51

Prawdopodobnie możesz spróbować tak:

PcentData = Sheets("Sheet1").Range("PcentData").Value
    If PcentData > 0 Then
        For Each pCell In Sheets("Sheet1").Range("PcentSwitch")
            If pCell.Value = 1 Then
                With Sheets("Payment-Deduction Form").Cells(pCell.Row, pCell.Column + 2).validation
                    .delete
                    .Add Type:=xlValidateInputOnly
                    .InputTitle = "Test"
                    .InputMessage = "Test"    
                End With
            End If    
        Next pCell
    End If

Usunąłem .Range i usunąłem walidacja z bieżącej komórki.

1
Vityata 16 luty 2017, 12:59