Пользовательская форма Excel VBA, обновление и удаление базы данных,

Я новичок в Excel VBA, и я нашел решения большинства своих проблем через Stackoverflow.com. Но все же есть проблема, которую я не смог решить. Я работаю над многомерной формой пользователя для поддержки нашей базы данных. Пользовательская форма, над которой я работаю, содержит поля параметров, флажки, текстовые поля и поля со списком. После долгих поисков и работы починил поисковые днища и все они работают. Но я не могу заставить работать нижнюю часть обновления и нижнюю часть удаления. Я загрузил файл, буду благодарен, если кто-нибудь поможет мне с этим вопросом.

Private Sub bt2_Click() 'Update shipment
Dim sonsat As Long, sor As String
If ListBox1.ListIndex = -1 Then
MsgBox "Choose an item", vbExclamation, ""
Exit Sub
End If

sor = MsgBox("Are your sure?", vbYesNo, "")
If sor = vbNo Then Exit Sub

lastrow = Sheets("logbook").Cells(Rows.count, 1).End(xlUp).Row
Sheets("logbook").Range("A1:A" & lastrow).Find(What:=ListBox1.Value, 
LookIn:=xlValues, LookAt:=xlWhole).Activate
sonsat = ActiveCell.Row
Cells(sonsat, 1) = op1
Cells(sonsat, 2) = op2
Cells(sonsat, 3) = chb1
Cells(sonsat, 4) = chb2
Cells(sonsat, 5) = tb14
Cells(sonsat, 6) = tb1
Cells(sonsat, 7) = tb2
Cells(sonsat, 8) = tb3
Cells(sonsat, 9) = tb4
Cells(sonsat, 10) = tb5
Cells(sonsat, 11) = cb1
Cells(sonsat, 12) = tb6
Cells(sonsat, 13) = tb7
Cells(sonsat, 14) = tb8
Cells(sonsat, 15) = tb9
Cells(sonsat, 16) = cb2
Cells(sonsat, 17) = tb10
Cells(sonsat, 18) = tb11
Cells(sonsat, 19) = tb12
Cells(sonsat, 20) = cb3
Cells(sonsat, 21) = cb4
Cells(sonsat, 22) = tb13


MsgBox "Item Has Been Changed", vbInformation, ""
ListBox1.list = Sheets("logbook").Range("A1:V" & 
Sheets("logbook").Cells(Rows.count, 1).End(xlUp).Row).Value

If Me.op1.Value = True Then
Cells(sonsat, 1).Value = "X"
Else
Cells(sonsat, 1).Value = "-"
End If

If Me.op2.Value = True Then
Cells(sonsat, 2).Value = "X"
Else
Cells(sonsat, 2).Value = "-"
End If

If Me.chb1.Value = True Then
Cells(sonsat, 3).Value = "X"
Else
Cells(sonsat, 3).Value = "-"
End If

If Me.chb2.Value = True Then
Cells(sonsat, 4) = "X"
Else
Cells(sonsat, 4) = "-"
End If
End Sub



Private Sub bt3_Click() 'delete shipmet
Dim sil As Long
Dim e, b, c, d As Integer


If ListBox1.ListIndex = -1 Then
MsgBox "Choose an entry", vbExclamation, ""
Exit Sub
End If

If ListBox1.ListIndex >= 0 Then
cevap = MsgBox("Entry will be deleted. ... Are you sure ?", vbYesNo, "")
If cevap = vbYes Then
Sheets("logbook").Range("A:A").Find(What:=ListBox1.Value).Activate
sil = ActiveCell.Row
Sheets("logbook").Rows(sil).Delete
End If
End If

For d = 1 To 2
Controls("op" & d) = False
Next

For c = 1 To 4
Controls("cb" & c) = "-"
Next

For b = 1 To 2
Controls("chb" & b) = False
Next

For e = 1 To 14
Controls("tb" & e) = ""
Next

ListBox1.list = Sheets("logbook").Range("A1:V" & 
Sheets("logbook").Cells(Rows.count, 1).End(xlUp).Row).Value
End Sub

person user128607    schedule 06.06.2017    source источник
comment
Это довольно сложно протестировать без пользовательской формы или данных образца (похоже, что последние должны быть минимальными). Вы получаете сообщение об ошибке? Если да, поделитесь, пожалуйста. Или он работает, но просто не делает того, что вы хотите? Думаю, эти вопросы относятся к обоим Subs. Лично я бы добавил Option Explicit в верхней части кода, который заставит вас объявить свои переменные, но также может автоматически выделить другие проблемы.   -  person Steve Lovell    schedule 07.06.2017
comment
А пока вот некоторые мысли. Когда вы обновляете свою строку, вы не используете, например, cb1.value просто cb1. Я бы попробовал первое, хотя не думаю, что это может быть причиной. При обновлении ячеек вы не указываете лист. Возможно, это не проблема, но я бы это проверил.   -  person Steve Lovell    schedule 07.06.2017
comment
Точно так же при обновлении элементов управления в подпункте удаления, я думаю, у вас должно быть .value.   -  person Steve Lovell    schedule 07.06.2017
comment
Стив, спасибо за комментарии. Однажды я попробовал Option Explicit, но это не сработало.   -  person user128607    schedule 07.06.2017
comment
Хорошо, у вас есть сообщение об ошибке?   -  person Steve Lovell    schedule 07.06.2017
comment
код представляет собой объектную переменную времени выполнения 91 или с неустановленной блочной переменной. есть ли способ прикрепить файл?   -  person user128607    schedule 08.06.2017
comment
Я не думаю, что SO предоставляет что-либо, но вы можете опубликовать ссылку на общий файл Dropbox или что-то подобное. В этом сообщении об ошибке вы можете сказать, какая часть кода ее вызывает? Подсказка: добавьте операторы debug.print в код в стратегических точках, чтобы увидеть, куда он попадает, и вывести значения ключевых переменных.   -  person Steve Lovell    schedule 08.06.2017
comment
Отладка находится внизу обновления и выделяет (Таблицы (журнал) .Range (A1: A & lastrow) .Find (What: = ListBox1.Value, LookIn: = xlValues, LookAt: = xlWhole) .Activate)   -  person user128607    schedule 08.06.2017
comment
Я поделился файлом на Google Диске, и вот ссылка drive.google .com / file / d / 0B2w6D_6K2zGneURKVkhvaFBNbWc /   -  person user128607    schedule 08.06.2017
comment
Здесь пора спать, но сначала: в этой части кода опубликованная вами версия разбита на две строки без символа продолжения. Вы не можете закончить строку с &, возможно, это не то, что у вас есть на самом деле, но лучше сначала проверить «легкие» возможности!   -  person Steve Lovell    schedule 08.06.2017
comment
Ой, подождите, это похожая строка из кода удаления. Кстати, я думаю, вы имеете в виду «кнопка», а не «дно».   -  person Steve Lovell    schedule 08.06.2017
comment
Не могли бы вы добавить перед этой строкой кода Debug.Print Listbox1.Value? Идея состоит в том, чтобы проверить, что кузнечное дело действительно работает, поиск найдет. Я думаю, это должно сработать, поскольку вы сказали, что ваш поиск работает.   -  person Steve Lovell    schedule 08.06.2017
comment
Надо лечь спать сейчас, но если ты найдешь способ загрузить куда-нибудь весь свой файл Excel, я поищу его утром.   -  person Steve Lovell    schedule 08.06.2017
comment
О, только что видел, как ты уже это сделал. Работаю над телефоном, так что пропустил. Вернусь утром.   -  person Steve Lovell    schedule 08.06.2017


Ответы (1)


Следующее основано на файле, который вы загрузили на Google Диск (по состоянию на 2017-06-08, 09:01 по британскому времени).

Я потерял несколько элементов управления при попытке открыть книгу, возможно, наши версии Excel слишком разные, чтобы моя могла с ними справиться. Это были ваши элементы управления датой dtp2 и dtp3. Я закомментировал относящийся к ним код всякий раз, когда они вызывали у меня проблемы. Надеюсь, это не повлияет отрицательно на то, что будет дальше ...

Основные предложения

  • Чтобы все заработало, мне пришлось объявить переменную lastrow и переменную cevap.

  • Ваш listbox1 допускает множественный выбор. Если вы хотите обновить только одну строку, вам нужно убедиться, что выбрана только одна строка. В разделе «Поведение» свойств элемента управления я бы изменил MultiSelect на 0 - fmMultiSelectSingle.

  • Поскольку вы разрешали множественный выбор, listbox1.value не работал. Вы должны сделать это по-другому, когда разрешаете множественный выбор (см. здесь). Но если у вас все в порядке с одиночным выбором, вам не нужно об этом беспокоиться.

  • Когда вы воспользуетесь своим Find ... Activate, вы получите другую ошибку. Excel не может Activate электронную таблицу, потому что Userform1 сохраняет фокус. Вы могли бы изменить это, сделав форму «немодальной», но я бы не стал. Вместо этого, а не, например:

    Sheets("logbook").Range("A1:A" & lastrow).Find(What:=ListBox1.Value, _
       LookIn:=xlValues, LookAt:=xlWhole).Activate
    sonsat = ActiveCell.Row
    

    I'd do

    sonsat = Sheets("logbook").Range("A1:A" & 
       lastrow).Find(What:=ListBox1.Value, _
    LookIn:=xlValues, LookAt:=xlWhole).Row
    

    Которые избегают необходимости Activate. После этого код должен работать без жалоб.

  • Однако он по-прежнему не делает того, что вы хотите. Значение списка основано на вашем связанном столбце, который вы установили как первый столбец. Это значение не однозначно идентифицирует строку. В результате, когда вы запускаете обновление / удаление, код обновляет / удаляет первую совпадающую строку.

Незначительные вопросы

  • В настоящее время ничто не мешает пользователю выбирать и обновлять / удалять строку заголовка. Лично я бы вынул их из списка (начиная с A2 вместо A1) и добавил в форму как «заголовки столбцов».

  • Я предполагаю, что заголовок формы должен быть «Приложение для ввода данных», а не «Приложение Data Entery».

person Steve Lovell    schedule 08.06.2017
comment
Прежде всего, большое спасибо за ваши ответы и помощь. извините за грамматику и опечатки. Я изменил sonsat, а также изменил список на одиночный выбор, и все в значительной степени работает. но возникла другая проблема. Я могу обновить до строки 1391. Также, когда я обновляю элемент (например, первый элемент), когда я дважды щелкаю по нему входящий, исходящий, сторонний и международный вариант, они не показывают значение в пользовательской форме. - person user128607; 09.06.2017
comment
Я создал эту пользовательскую форму, а затем копирую данные из другого файла Excel в новый файл Excel, в котором есть пользовательская форма. это может быть проблемой? - person user128607; 09.06.2017
comment
Не знаю, как скоро я смогу на это взглянуть. Возможно, стоит задать его как новый вопрос. Не стесняйтесь отмечать меня (например, @SteveLovell) в комментарии к нему, и я посмотрю, когда смогу. - person Steve Lovell; 09.06.2017
comment
Когда я нажимаю на строку 1391 с выдуванием элемента, появляется ошибка времени выполнения '91 'Переменная объекта или переменная блока не установлена ​​и отлаживаются листы (журнал) .Range (A2: A & lastrow) .Find (What: = ListBox1 .Value, LookIn: = xlValues, LookAt: = xlWhole). Активировать в listbox1_click () - person user128607; 09.06.2017
comment
Проблема с флажками и переключателями заключается в том, что значениями вызова являются X и - но элементы управления должны быть установлены на True и False. Вам нужно преобразовать значения (как при чтении, так и при записи записей). Проблема 1391, я не могу воспроизвести с той версией, которая у меня есть. - person Steve Lovell; 09.06.2017
comment
У меня есть догадка о другой проблеме, а именно о том, что вашим новым записям не был присвоен идентификатор для их уникальной идентификации, поэтому «найти» не удается. - person Steve Lovell; 10.06.2017