Страницы: 1
RSS
При попытке очистки полей пользовательской формы возникает ошибка "1004"
 
Имеется лист "БД" (база данных), к ячейкам "В" (название организаций) которого прикреплена пользовательская форма (расширенные сведения об организации). В случае ликвидации организации все данные о ней должны быть удалены из БД при нажатии кнопки CommandButton6 ("Очистить все", расположенной на форме. Однако вместо этого возникает ошибка '1004' с подсветкой строки ".Cells..."
Помогите, пожалуйста, избавиться от этой напасти. Прошу прощения за слабое знание VBA.
Ниже привожу текст кода, расположенного в модуле листа "БД".
Код
Private Sub CommandButton6_Click()
         With Worksheets("БД")
        .Cells(.iRow1, "F").ClearContents
        .Cells(.iRow1, "N").ClearContents
        .Cells(.iRow1, "O").ClearContents
        .Cells(.iRow, "P").ClearContents
        .Cells(.iRow, "Q").ClearContents
        .Cells(.iRow, "R").ClearContents
        .Cells(.iRow, "S").ClearContents
        .Cells(.iRow, "T").ClearContents
        .Cells(.iRow, "U").ClearContents
        .Cells(.iRow, "V").ClearContents
        .Cells(.iRow, "W").ClearContents
        .Cells(.iRow, "X").ClearContents
        .Cells(.iRow, "Y").ClearContents
        .Cells(.iRow, "Z").ClearContents
        .Cells(.iRow, "AA").ClearContents
      End With
    Unload Me
  MsgBox "Данные удалены"
End Sub

А здесь показан код вызова пользовательской формы.

   
Код
Public iRow&, iRow1&


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim iRow&: iRow = Target.Row
    If Not Intersect([H6:H1105], Target) Is Nothing Then
       If LCase(Trim(Target)) = "ñäåëàíî" Then 'If Target = "ñäåëàíî" Then
         iRow1 = Target.Row
            With UserForm2
               .TextBox19 = Cells(iRow1, "A")
               .TextBox20 = Cells(iRow1, "B")
               .TextBox21 = Cells(iRow1, "F")
               .TextBox22 = Cells(iRow1, "I")
               .TextBox23 = Cells(iRow1, "J")
               .Show
           End With
      End If
       ElseIf Not Application.Intersect(Range("D6:D1105"), Target) Is Nothing Then
              UserForm1.Show
          ElseIf Not Application.Intersect(Range("F6:F1105"), Target) Is Nothing Then
              UserForm1.Show
            ElseIf Not Intersect([B6:B1105], Target) Is Nothing Then
               With Card
                  .TextBox1 = Cells(iRow, "A")
                  .TextBox2 = Cells(iRow, "B")
                  .TextBox3 = Cells(iRow, "N")
                  .TextBox4 = Cells(iRow, "O")
                  .TextBox5 = Cells(iRow, "P")
                  .TextBox6 = Cells(iRow, "Q")
                  .TextBox7 = Cells(iRow, "R")
                  .TextBox8 = Cells(iRow, "S")
                  .TextBox9 = Cells(iRow, "T")
                  .TextBox10 = Cells(iRow, "U")
                  .TextBox11 = Cells(iRow, "V")
                  .TextBox12 = Cells(iRow, "W")
                  .TextBox13 = Cells(iRow, "X")
                  .TextBox14 = Cells(iRow, "Y")
                  .TextBox15 = Cells(iRow, "Z")
                  .TextBox16 = Cells(iRow, "AA")
                  .TextBox17 = Cells(iRow, "K")
                  .TextBox18 = Cells(iRow, "L")
                  .Show
               End With
          End If
End Sub
 
Точки перед .iRow1 с каким умыслом написаны?
Лучше бы файл приложили, кто знает, что у вас в той iRow1, может пусто?
Изменено: kalbasiatka - 04.03.2015 21:40:07
 
Уверен, что точки написаны на обум :-)
Уберите их - точки допускаются в данном случае только для зарезервированных объектов: Cells, Range и прочим объектам на листе "БД"
Кстати, код можно сократить:
Вместо:
Код
        .Cells(.iRow, "P").ClearContents
        .Cells(.iRow, "Q").ClearContents
        .Cells(.iRow, "R").ClearContents
        .Cells(.iRow, "S").ClearContents
        .Cells(.iRow, "T").ClearContents
        .Cells(.iRow, "U").ClearContents
        .Cells(.iRow, "V").ClearContents
        .Cells(.iRow, "W").ClearContents
        .Cells(.iRow, "X").ClearContents
        .Cells(.iRow, "Y").ClearContents
        .Cells(.iRow, "Z").ClearContents
        .Cells(.iRow, "AA").ClearContents
можно одной строкой
Код
.Range(.Cells(iRow, "P"),.Cells(.iRow, "AA")).ClearContents
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
1) Точки убрал. Не помогло, к сожалению.
2) Часть кода (с точками) был взят на одном из форумов и успешно применен здесь же. При вызове второй формы (графа "Статус предложения", ячейки, содержащие текст "сделано"). После переноса данных в архив, четыре нужных ячейки очищаются.
3) По поводу сокращения кода: как быть, если очищаемые ячейки расположены не подряд. Например, B - F и  I - AA.

Отправил файл. Всем большое спасибо за участие, однако жду помощи.
 
Не передаётся значение переменной iRow в процедуру Private Sub CommandButton6_Click().
Не долго думая, можно исправить так:
Код
Private Sub CommandButton6_Click()
iRow = ActiveCell.Row
       With Worksheets("БД")
        .Cells(iRow, "F").ClearContents
...
...
 
Спасибо, k61, похоже, Вы правы.
 
В дополнение в предыдущей проблеме возникла новая, правда, отличная по названию от первоначальной. На пользовательской форме имеется кнопка "Новая запись", при нажатии которой макрос должен определить ближайшую строчку с пустой ячейкой "И" (название организации) и ввести в эту строку данные о новой организации. При этом должна осуществляться проверка на наличие вновь введенного названия организации с уже введенными. Привожу код. Наколбасил такое, что самому стыдно.

Код
Private Sub CommandButton5_Click()
Dim iLastRow As Long
Dim iFoundRng As Range
iRow = ActiveCell.Row
    If Me.TextBox2 = "" Then
        MsgBox "Ââåäèòå èíôîðìàöèþ â ïîëå 1", vbExclamation, "Îøèáêà"
        Exit Sub
    End If
        Set iFoundRng = Columns("B").Find(what:=Me.TextBox1.Text, LookAt:=xlWhole) 'ÿ÷åéêà öåëèêîì
        'åñëè òàêàÿ çàïèñü óæå åñòü
        If Not iFoundRng Is Nothing Then
            If MsgBox("Òàêàÿ çàïèñü óæå ñóùåñòâóåò. Çàìåíèòü å¸?" & vbCr & "Äà - çàìåíèòü ñòàðóþ, Íåò - äîáàâèòü â áàçó", vbYesNo + vbExclamation, "Âíèìàíèå!") = vbYes Then
                Cells(iRow, "B") = Me.TextBox2
                Cells(iRow, "P") = Me.TextBox3
                Cells(iRow, "O") = Me.TextBox4
                Cells(iRow, "P") = Me.TextBox5
                Cells(iRow, "Q") = Me.TextBox6
                Cells(iRow, "R") = Me.TextBox7
                Cells(iRow, "S") = Me.TextBox8
                Cells(iRow, "T") = Me.TextBox9
                Cells(iRow, "U") = Me.TextBox10
                Cells(iRow, "V") = Me.TextBox11
                Cells(iRow, "W") = Me.TextBox12
                Cells(iRow, "X") = Me.TextBox13
                Cells(iRow, "Y") = Me.TextBox14
                Cells(iRow, "Z") = Me.TextBox15
                Cells(iRow, "AA") = Me.TextBox16
                Exit Sub
            End If
         End If
    
    MsgBox "Èíôîðìàöèÿ äîáàâëåíà!", vbInformation, "ÁÄ"
End Sub
 
Мне кажется, что вы в столбе "B" ищите значение не того TextBox'са.
 
Но почему же? В столбце "В" расположены названия организаций, в TextBox2 - краткое название организации (то же самое).
 
Я про эту строку:
Код
Set iFoundRng = Columns("B").Find(what:=Me.TextBox1.Text, LookAt:=xlWhole)
Страницы: 1
Наверх