Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2009, 23:07   #1
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию Граматика

Подскажите пожалуйста, как правильно написать в VBA следующее:
Если ячейка1=ячейке2, то ячейка3=ячейка1+ячейка2

Зараннее благодарен.
systemmind вне форума Ответить с цитированием
Старый 08.02.2009, 23:17   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub test()
    ' Если ячейка1=ячейке2, то ячейка3=ячейка1+ячейка2

    ' если складываем целые числа, но может встретиться что-то другое
    If [a1] = [b1] Then [c1] = Val([a1]) + Val([b1])

    ' если складываем числа
    If [a1] = [b1] Then [c1] = [a1] + [b1]

    ' если складываем текстовые строки
    If [a1] = [b1] Then [c1] = [a1] & [b1]
    
    ' PS: есть некоторые нюансы при работе с дробными числами
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 22.02.2009, 18:05   #3
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию

Еще вопрос, помогите пожалуйста правильно записать цикл в VBA:

For i = 0 To 5
Если значение ячейки A1 равно значению i-той ячейке столбца B Then [c1]=[A1] Else [c1] = "Значение не найдено"
Next i
systemmind вне форума Ответить с цитированием
Старый 22.02.2009, 18:10   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Например, так:
Код:
Sub test()
    For i = 1 To 5
        If [a1] = Cells(i, "B") Then [c1] = [a1] Else [c1] = "Значение не найдено"
    Next i
End Sub
Обратите внимание, цикл начинается не с нуля, а с единицы.

Правильнее было бы так:
Код:
Sub test()
    [c1] = "Значение не найдено"
    For i = 1 To 5
        If [a1] = Cells(i, "B") Then [c1] = [a1]: Exit For
    Next i
End Sub
А то у Вас почти всегда будет результат "Значение не найдено"

Если в ячейке b3 значение совпадёт с a1, то в с1 будет записано значение из a1
Но при проверке следующей ячейки - b4 значение уже не совпадёт с a1, то в с1 будет записано "Значение не найдено"


И вообще, весь код можно записать в одну строку:
Код:
Sub test2()
    [c1] = IIf([OR(B1:B5=A1)], [a1], "Значение не найдено")
End Sub
А ещё лучше в данном случае использовать формулы вместо макросов.

Последний раз редактировалось EducatedFool; 22.02.2009 в 18:33.
EducatedFool вне форума Ответить с цитированием
Старый 22.02.2009, 19:51   #5
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Например, так:

Если в ячейке b3 значение совпадёт с a1, то в с1 будет записано значение из a1
Но при проверке следующей ячейки - b4 значение уже не совпадёт с a1, то в с1 будет записано "Значение не найдено"
Да, спасибо большое. Но я просто очень сильно упростил вопрос. Дело в том, что у меня в случае, если и b3 и b4 равны a1, то значение b4 записывается уже в с2, так требует задача.

Но вот еще один вопрос, если нужно вложить IF в IF? т.е.
If ... then If ... then ... else ... else. Не будет ли путаницы в If и else? И есть ли в VBA какой-нибудь оператор, наподобие begin-а в паскале?
systemmind вне форума Ответить с цитированием
Старый 22.02.2009, 20:08   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
если нужно вложить IF в IF
Посмотрите здесь: http://bit.pirit.info/forum/viewtopic.php?t=1497
Подробнее можно поискать здесь.

Цитата:
И есть ли в VBA какой-нибудь оператор, наподобие begin-а в паскале?
Нет. В VB / VBA вместо конструкции Begin ... End используется переход на новую строку (внутри конструкций типа if then else)

Цитата:
Дело в том, что у меня в случае, если и b3 и b4 равны a1, то значение b4 записывается уже в с2, так требует задача.
Вы бы сразу изложили условие задачи - давно бы получили ответ из нескольких строк кода, и уже изучали бы готовый макрос.
EducatedFool вне форума Ответить с цитированием
Старый 23.02.2009, 00:41   #7
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вы бы сразу изложили условие задачи - давно бы получили ответ из нескольких строк кода, и уже изучали бы готовый макрос.
Да)Действительно попросить кого-то было бы легче, но нет. Я не могу спихнуть свою проблему на других, не попытавшись хоть чуть-чуть в ней разобраться) Но вот, наконец, благодаря вашему форуму я, хоть немного поняв VBA, сделал следующее творение.

Задача: Есть таблица со значениями. Нужно чтобы во время ввода данных в ячейку эти данные мгновенно проверялись на наличие в этой таблице, и если таковы имеются, то они выводятся справа в столбик. При нажатии Энтер, значение из ячейки, в которую производится ввод записывалось в конец таблицы. Что у меня не выходит, так это то, что после выполнения TextBox1_KeyUp процедура TextBox1_Change() не реагирует на изменения в столбце G. Подскажите почему? И еще, как можно сделать так, что бы при условии несовпадения значения в ячейке b4 и в ячейках столбца h, ячейка с4 содержала в себе "Значение отсутствует"??
Вложения
Тип файла: rar 1.rar (11.1 Кб, 7 просмотров)

Последний раз редактировалось systemmind; 23.02.2009 в 00:44.
systemmind вне форума Ответить с цитированием
Старый 23.02.2009, 02:05   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Задание понял лишь частично.

Цитата:
Что у меня не выходит, так это то, что после выполнения TextBox1_KeyUp процедура TextBox1_Change() не реагирует на изменения в столбце G. Подскажите почему?
А с какой стати TextBox1 должен реагировать на изменения в ячейках столбца G ?
При изменениях на листе срабатывает Worksheet_Change, но никак не TextBox1_Change.


Посмотрите вложение.
Введите в ячейку b4 (точнее, в TextBox, расположенный над этой ячейкой), число 256
Вложения
Тип файла: rar текстбокс в ячейке - версия 2.rar (12.4 Кб, 16 просмотров)
EducatedFool вне форума Ответить с цитированием
Старый 23.02.2009, 13:32   #9
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию

Все отлично! Спасибо! Впринципе мне это и требовалось. Для меня не понятно только то, каким образом производится запись адресов в столбец d? Может в этих строчках:

Set newcell = Cells(Rows.Count, 3).End(xlUp).Offset(1)
newcell = cell: newcell.Next = cell.Address

если нет, то скажите пожалуйста, что они означают?

И еще 2 вопроса.

1. у меня еще заполнены столбцы H и I. Так вот как сделать так, чтобы значения ячеек столбца H записывлись вместо адресов ячеек слобца С? (cо столбцом I, думаю сам разберусь).

2. Как мне поступить с текстбоксом, если понадобится его перенести в другую ячейку?

Зараннее, очередной раз, спасибо)
systemmind вне форума Ответить с цитированием
Старый 23.02.2009, 19:40   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
каким образом производится запись адресов в столбец d? Может в этих строчках:
Да, именно в этих строках.

Цитата:
Как мне поступить с текстбоксом, если понадобится его перенести в другую ячейку?
Перетащить его мышкой в другую ячейку, и изменить его размеры при необходимости.

Чтобы выделить текстбокс (для перетаскивания): (в Excel 2003)
1) Отображаем панель инструментов Visual Basic
2) На этой панели нажимаем кнопку Режим конструктора
3) Щёлкаем по ячейке B4
Текстбокс будет выделен.

Не забывайте, что значения из текстбокса пишутся в ячейку под ним. Так что, после переноса текстбокса, необходимо заменить все ссылки на ячейку [b4] на адрес новой ячейки.

Цитата:
у меня еще заполнены столбцы H и I. Так вот как сделать так, чтобы значения ячеек столбца H записывлись вместо адресов ячеек слобца С?
Для этого надо заменить строку
Код:
newcell = cell: newcell.Next = cell.Address
на строку
Код:
newcell = cell: newcell.Next = cell.Next & "  " & cell.Next.Next
Пример во вложении:
Вложения
Тип файла: rar текстбокс в ячейке - версия 3.rar (13.9 Кб, 15 просмотров)

Последний раз редактировалось EducatedFool; 23.02.2009 в 19:44.
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц