Страницы: 1
RSS
как исключить ввод одинаковых данных в базу?
 
Всем доброго дня и с наступающим Новым Годом!  
Есть БД из двух столбцов в первом столбце вводятся номера телефонов а во втором столбце соответствующие этим телефонам адреса. И изо дня в день нет да нет вводятся одинаковые номера ибо звонят постоянные клиенты. Хочется написать макрос который бы активировался при нажатии Ctl+a чтобы выводилось активное окно с полем для ввода телефона и полем для ввода адреса и с кнопками "записать" и "очистить".  
При вводе телефона в поле после набора каждой цифры номера телефона макрос ищет первое совпадение и ставит маркер на ячейке где нашлось совпадение с введенными данными. Как только получается ситуация, что после ввода очередной цифры макрос не находит совпадения всем набранным цифрам, оператор понимая что такого телефона нет в БД дозаполняет его полностью, потом переходит в поле для ввода адреса, вводит адрес и нажимает на кнопку "запись". Данные заносятся в последнюю строку списка т.е. на первую пустую. (телефон в ячейку А(х) а адрес в ячейку В(х), где х-первая пустая строка)  
   Например оператор намерен ввести номер (9519012345) вводит "9", маркер переходит на ячейку в столбце А где есть телефон в котором первая цифра "9" далее оператор нажимает кнопку "5" маркер переходит в ячейку с номером начинающимся на 95 и т.д. пока оператор либо увидит в выделенной маркером ячейке такой же номер телефона что она и собирается ввести, тогда она нажмет кнопку "очистить" и поле где она вводила номер очистится, либо она довведет весь номер и адрес и нажмет кнопку "запись" и в последней строке БД появится новый клиент.
 
странно почему я получился безимянным, вроде логинился перед созданием темы...  
Прошу у кого есть возможность написать данный макрос, думаю для профи он не сложный и не большой. Заранее благодарен.
 
вы бы ещё сразу написали, что у настоящего "Профи" такой макрос должен быть уже написан!  
 
P.S. И почему все считают, что писать макросы - это очень легко и очень быстро, минут 5 не больше.  
 
P.P.S. Почему программисту 1С можно платить 100.000 руб. в месяц, а программисту VBA - тысяч 10.000, а то и вообще "для профи это не сложно, можно и за еду"
 
вы бы хоть небольшой файл-пример приложили бы  
 
P.S. Понятно, что мы с вами в одной компании работаем и наша работа заключается в забивании телефонов в БД, но всё же
 
сделал немного иначе, без маркеров! попробуйте! кажется удобно получилось!
 
{quote}{login=}{date=24.12.2011 12:56}{thema=}{post}P.S. И почему все считают, что писать макросы - это очень легко и очень быстро, минут 5 не больше.  
 
P.P.S. Почему программисту 1С можно платить 100.000 руб. в месяц, а программисту VBA - тысяч 10.000, а то и вообще "для профи это не сложно, можно и за еду"{/post}{/quote}Потому, что позиционируется это так, отучать надо. Я сейчас сижу на форуме по js http://javascript.ru/forum/, там таких товарищей сразу в раздел работа отправляют, да и ценник там совсем другой. Не берусь утверждать, но примерно x2 или x3 от того, может получить VBA-программист.  
 
Почти аналогичный пример: http://javascript.ru/forum/job/24051-nuzhna-pomoshh.html  
 
Пример задания/работы по js на 100$:  
http://javascript.ru/forum/job/24231-shablon-stranicy.html  
 
 
Мое мнение: отучать надо, а то народ совсем обнаглел. Одно дело, когда начинающий программист делает какую-то работу, чтобы набраться опыта, а другое... Впрочем, как мне кажется, подобные задачи даже начинающий на халяву делать не обязан.  
 
 
AKSENOV048, объявляйте переменные и указывайте конкретные св-ва объектов с кот. работаете.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Здравствуйте nerv! а можете подсказать что именно не правильно?
 
{quote}{login=AKSENOV048}{date=24.12.2011 06:11}{thema=}{post}Здравствуйте nerv! а можете подсказать что именно не правильно?{/post}{/quote}Саша, поставьте первой строкой в модуле формы:  
Option Explicit  
и все станет понятно. А на будущее ставьте галку как на рисунке.
Я сам - дурнее всякого примера! ...
 
Я не Nerv, но посмотрел код немного,  
 
1) Вам нужно поставить галочку в вашем редакторе VBA в разделе Tools - Options - Editor - Require Variable Declaration  
 
2) при использовании любых переменных их лучше явно объявлять, например, в вашем примере, не объявлены переменные x и i  
Соответственно, х у вас диапазон ячеек, поэто Dim x As Range  
i у вас переменная цикла, поэтом Dim i As Long  
и т.д.  
 
P.S. VBA допускает использование необъявленных переменных, а вот другие языки уже давно бы ругались и код бы не запускался
 
Всем большое спасибо! почитал информацию, понял свою ошибку.
 
Вот я почти никогда не объявляю переменные типа string, long и т.п.  
(а переменные типа workbook, worksheet и range - объявляю только потому, что программисты Excel поленились сделать нормально работающий IntelliSense, в отличие от программистов Word)  
 
И что, от этого мои макросы хуже работают?  
А галочку "Require Variable Declaration", как и автопроверку синтаксиса, я отключаю первым делом после установки Office на свой компьютер. (в момент набора первого же макроса)
 
И в чем выигрыш, Игорь? Переменные типа вариант, работают медленней, потребляют больше памяти и ресурсов. В случае очепятки в имени переменной Экс не ругнется, на выходе может быть Бог знает что. И все это счастье ради сокращения пары строк деклараций?
Я сам - дурнее всякого примера! ...
 
Игорь, конечно же твои макросы работают не хуже. Просто в глобальном плане при программировании принято явно объявлять переменные. Кто-то объявляет переменные, кто-то нет. У вас есть шанс использовать переменную "с" на английском и "с" на русском языке, а у человека с Option Explicit или с тем, кто всегда объявляет все использованные переменные, такого шанса нет.  
 
P.S. Кто-то использует презерватив при использовании девушки/жены, а кто-то не использует. У одного есть шанс столкнуться с последствиями (дети, вирусы), а у другого таких шансов нет (меньше). Так что, кто как привык, тот так и программирует, живёт и любит...
 
ребят, пробежал бегло ваши комментарии, хочу сказать, я не халявщики и выезжать полностью на чужом труде не собираюсь. Мне интересно и самому программировать по мере возможности и никакой сильно финансовой подоплеки в моей посьбе в написании макроса нет.  
 
агромное спасибо AKSENOV048, хороший вариант. Немного доработал под себя.  
Сейчас вопрос: как сделать чтобы фон ячейки для ввода номера телефона становился красным когда вводишь номер телефона и при вводе очередной цифры получается что номер вводимого телефона оказывается новым для базы данных? Т.Е. допустим в БД есть номер 21103 а мы вводим 21107 и при воде цифр 2, 1, 1, 0 макрос помещается на ячейку которая содержит телефон 21103 но когда мы вводим следующую цифру, а именно "7" после её ввода система не находит совпадения и должна окрашивать фон поля ввода номера телефона в красный цвет. Подскажите плиз как это реализовать?  
 
и еще вопрос: как сделать чтобы после нажатия кнопки "Запись" и после обработки программы которая соответствует кнопке, чтобы маркер после нажатия кнопки становился в поле для вода телефона, чтобы оператору не нужно было бы тыкать мышкой в поле для ввода телефона, чтобы ввести его?
 
ой, забыл сам пример выложить. Вот он.
 
Приблизительно так  
 
Private Sub ComboBox1_Change()  
   Set x = Range([a2], Cells(Rows.Count, 1).End(xlUp)).Find(what:=Me.ComboBox1.Value, lookat:=xlWhole, LookIn:=xlValues)
   If Not x Is Nothing Then  
       Me.TextBox1.Value = x.Offset(, 1).Value: Cells(x.Row, 1).Select: Me.Caption = "Телефон: " & Me.ComboBox1.Value & " Адрес: " & Me.TextBox1.Value  
   Else  
       If Me.ComboBox1.Value <> "" Then Me.ComboBox1.BackColor = vbRed  
       TextBox1 = "ЧУЖОЙ!"  
   End If  
End Sub  
 
Private Sub CommandButton1_Click()  
   Me.ComboBox1.BackColor = &H80000005  
   If Me.ComboBox1.Value = Val(ActiveCell) Then MsgBox "Данный номер телефона уже есть в базе!": Exit Sub  
   Dim iLastRow As Long: iLastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1  
   Cells(iLastRow, 1) = Me.ComboBox1.Value  
   Cells(iLastRow, 2) = Me.TextBox1.Value  
   ComboBox1 = ""  
   Me.TextBox1.Text = ""  
   Me.ComboBox1.SetFocus  
End Sub
 
Mouse, аагромное спасибо, все вставил, причесал - работает.
Страницы: 1
Читают тему
Наверх
Loading...