Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Не могу подружить If и Select Case, чтобы в результате выйти на один код
 
Здравствуйте!

Знатоки, помогите, пожалуйста, в решении проблемы:

макрос импортирует данные из файла .csv и вставляет их в ячейки текущего столбца ниже 12-ой строки.
Эти ячейки могут быть без данных, и тогда проблем нет; или с данными - тогда нужно спросить пользователя, перезаписывать их или нет.
КОД(Import) как раз и отвечает за импорт данных. Это не совсем маленький код, и вставлять его два раза - неспортивно.
Вопрос: какие есть варианты?
Запись КОДа(Import) в отдельную функцию у меня не получился.
Сейчас пока работает так:
Код
'код в модуль листа. Для выполнения даблкликнуть ячейку в третьей строке
'
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim lLastRow As Integer
    Cancel = True
    lLastRow = Cells(Rows.Count, Target.Column).End(xlUp).Row
    
   If Target.Row <> 3 Then Exit Sub ' если активная ячейка не принадлежит 3-й строке, ничего не делать
   If lLastRow > 12 Then     ' если последняя заполненная ячейка расположена ниже 12-ой строки текущего столбца, 
   'значит, в ячейках есть данные, которые будут заменены при выполнении КОДа(Import). Выводим сообщение:
      Select Case MsgBox("Переписать существующие данные?", vbYesNo + vbQuestion + vbDefaultButton2, "Внимание!")
         Case vbNo
            MsgBox ("ОК, ничего не меняем, все оставляем как есть.")
            Exit Sub
         Case vbYes
            MsgBox ("Перезаписываю данные...")
        '--------------------
        '    КОД(Import)
        '--------------------
      End Select
   Else       ' если lLastRow =<12, ячейки без данных, можно без вопросов импортировать в них данные:
        '--------------------
        '    КОД(Import)
        '--------------------
   End If
End Sub
 
Так вроде там всё проще организовывается:
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim lLastRow As Integer
    Cancel = True
    lLastRow = Cells(Rows.Count, Target.Column).End(xlUp).Row

    If Target.Row <> 3 Then Exit Sub    ' если активная ячейка не принадлежит 3-й строке, ничего не делать
    If lLastRow > 12 Then     ' если последняя заполненная ячейка расположена ниже 12-ой строки текущего столбца,
        'значит, в ячейках есть данные, которые будут заменены при выполнении КОДа(Import). Выводим сообщение:
        Select Case MsgBox("Переписать существующие данные?", vbYesNo + vbQuestion + vbDefaultButton2, "Внимание!")
        Case vbNo
            MsgBox ("ОК, ничего не меняем, все оставляем как есть.")
            Exit Sub
        Case vbYes
            MsgBox ("Перезаписываю данные...")
        End Select

    End If
    '--------------------
    '    КОД(Import)
    '--------------------

End Sub

 
Да и вообще можно без Select Case - проверяем сразу vbYesNo
 
Цитата
Юрий М написал:
Да и вообще можно без Select Case - проверяем сразу  vbYesNo
Это для меня ОЧЕНЬ сложно:D

Цитата
Hugo написал:
Так вроде там всё проще организовывается:
Ну что такое... Я ломал голову над этой проблемой целый день(!), а тут пришли Вы, и за десять минут её решили! Все отлично сработало!
Огромное СПАСИБО!
 
Цитата
Александр написал:
Это для меня ОЧЕНЬ сложно
Да ничего сложного - даже проще)) См. небольшой пример:
Код
Sub TestMsgBox()
    If MsgBox("Нажмите любую кнопку.", vbYesNo) = vbYes Then
        MsgBox "Вы нажали кнопку ДА."
    Else
        MsgBox "Вы нажали кнопку НЕТ."
    End If
End Sub



 
Цитата
Hugo написал:
Так вроде там всё проще организовывается:
Может, я что-то не понял. У автора темы условие срабатывания "КОД(Import)" - это "lLastRow =<12", а у вас, Hugo, он будет отрабатывать всегда. Или я чего-то недопонял? :sceptic:
There is no knowledge that is not power
 
Цитата
Johny написал:
У автора темы условие срабатывания "КОД(Import)" - это "lLastRow =<12", а у вас, Hugo, он будет отрабатывать всегда. Или я чего-то недопонял?
Нет, два условия срабатывания  "КОД(Import)" :
1. Срабатывание при  lLastRow =<12"
или
2. Срабатывание, если lLastRow >12, и после вопроса о замене данных -  ответ пользователя "Да"
Изменено: Александр - 13 Мар 2015 23:11:49
 
Цитата
Юрий М написал:
Да ничего сложного - даже проще)) См. небольшой пример:
Теперь понял, что Вы имели в виду. Я кстати, так сначала (всмысле, вчера :)) и раскладывал MsgBox, но (сегодня:D) увидел более наглядный, с моей т.з., вариант. Но он в данном случае не помог мне...
Изменено: Александр - 13 Мар 2015 23:13:50
 
тормозит форум, неактуально...
Изменено: Hugo - 13 Мар 2015 21:39:44
 
Александр, не нужно цитировать сообщение целиком - кнопка "Цитировать" не для этого. Выделяем текст, который хотим процитировать, и только после этого жмём на кнопку. Да и можно отвечать без цитирования вообще...
 
Юрий М

Ошибку осознал, постараюсь не повторять
Вроде лишнее из цитат вырезал, а сейчас посмотрел - оказывается, не все.
Upd. подчистил цитаты в своих ответах.
Изменено: Александр - 13 Мар 2015 23:15:20
Страницы: 1
Читают тему (гостей: 1)