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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 07:45   #1
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию Написал программу, все работает кроме одного момента.

Написал программу, все работает кроме одного момента.
Вообщем смысл программы такой, пользователь вводит код товара и количество купленного товара, от количества купленного товара зависит скидка, если количество купленного товара меньше минимального, то скидка не предоставляется, о чёмм выводится сообщение, и если количество купленного товара больше, чем минимально необходимо, то скидка предоставляется. Когда пускаю программу выводится одно и тоже сообщение если купили больше чем необходимо, а также если купили меньше. Понимаю, что ошибка где-то в блоке If ... Then в цикле Do, однако найти не могу, логические вроде все правильные.
ВОТ КОД ПРОГРАММЫ. За стиль не упрекайте, занимаюсь этим целых 4 месяца!!!
Public Sub Пример9()
Kodtovara = InputBox("Введите код товара", "Код товара")
Kodtovara = UCase(Kodtovara)
If Kodtovara = "" Then
MsgBox "Вы не ввели код товара"
Exit Sub
End If
Kolvo = InputBox("Введите количество приобретаемого товара", "Количество товара")
If Kolvo = "" Then
MsgBox "Вы не ввели количество приобретаемого товара"
Exit Sub
End If
asd = 1
Do Until Range("A3").Offset(asd, 0) = "" And Range("B3").Offset(asd, 0) = "" And Range("C3").Offset(asd, 0) = "" & _
Range("D3").Offset(asd, 0) = ""
kod = Range("A3").Offset(asd, 0)
cena = Range("B3").Offset(asd, 0)
minkol = Range("C3").Offset(asd, 0)
skidka = Range("D3").Offset(asd, 0)
stoimost = cena * Kolvo
itog = stoimost * (1 - skidka)
If kod = "" Then
MsgBox "Вы ввели код товара который отсутствует в списке"
Exit Sub
ElseIf kod = Kodtovara And Kolvo < minkol Then
MsgBox "Вы приобрели " & Kolvo & " единиц(ы) товара, Вам скидка не предоставляется, минимальный " & _
"заказ должен быть более " & Range("C3").Offset(asd, 0) & " единиц товара"
Exit Do
ElseIf kod = Kodtovara And Kolvo >= minkol Then
MsgBox "Вы приобрели " & Kolvo & " единиц товара " & Kodtovara & ". " & _
" Общая стоимость составляет " & Format(stoimost, "$#.00") & ". Поскольку приобретено больше " & minkol & " единиц" & _
", то Вам предоставляется скидка в размере " & FormatPercent(skidka, 2) & " от общей стоимости " & _
". Итого стоимость с учетом скидки равна " & itog & "."
Exit Do
Else
asd = asd + 1
End If
Loop
End Sub
Palomnik1096 вне форума Ответить с цитированием
Старый 09.12.2010, 09:29   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Не хватает AND (?) перед
Range("D3").Offset(asd, 0) = ""
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.12.2010, 11:40   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Public Sub Пример9()
  kodtovara = UCase(InputBox("Введите код товара", "Код товара"))
  If kodtovara = "" Then
    MsgBox "Вы не ввели код товара"
    Exit Sub
  End If
  Kolvo = CDbl(InputBox("Введите количество приобретаемого товара", "Количество товара"))
  If Kolvo = 0 Then
    MsgBox "Вы не ввели количество приобретаемого товара"
    Exit Sub
  End If
  asd = 1
  Do
    If kodtovara = Range("A3").Offset(asd, 0) Then
      cena = Range("B3").Offset(asd, 0)
      minkol = Range("C3").Offset(asd, 0)
      skidka = Range("D3").Offset(asd, 0)
      stoimost = cena * Kolvo
      itog = stoimost * (1 - skidka)
      If Kolvo < minkol Then
        MsgBox "Вы приобрели " & Kolvo & " единиц(ы) товара, Вам скидка не предоставляется, минимальный " & _
        "заказ должен быть более " & Range("C3").Offset(asd, 0) & " единиц товара"
      Else
        MsgBox "Вы приобрели " & Kolvo & " единиц товара " & kodtovara & ". " & _
        " Общая стоимость составляет " & Format(stoimost, "$#.00") & ". Поскольку приобретено больше " & minkol & " единиц" & _
        ", то Вам предоставляется скидка в размере " & FormatPercent(skidka, 2) & " от общей стоимости " & _
        ". Итого стоимость с учетом скидки равна " & itog & "."
      End If
      Exit Do
    End If
    asd = asd + 1
  Loop Until Range("A3").Offset(asd, 0) = ""
  If Range("A3").Offset(asd, 0) = "" Then
    MsgBox "Товара " & kodtovara & " - нет в базе! Повторите попытку"
  End If
End Sub
ваше сравнение if Kolvo < minkol then ... всегда будет False потому что Kolvo - это строка, а minkol - скорее всего число, полученное из таблицы. А строка всегда больше числа, чтобы Вы туда не написали. Выполните тестовую процедуру ниже и посмотрите результат
Код:
Sub test()
  a = InputBox("Press OK button", "???", "1")
  b = 1000000
  If a < b Then MsgBox a & " < " & b else MsgBox a & " > " & b
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 09.12.2010, 13:30   #4
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

ваше сравнение if Kolvo < minkol then ... всегда будет False потому что Kolvo - это строка, а minkol - скорее всего число, полученное из таблицы.

Да я думаю Вы правы, потому что пробывал просмотреть через Ф8, и там получается Kolvo показывет в кавычках, а minkol без кавычек, пытался понять, почему это так, но так не понял. Спасибо за ответ!

Просмотрел Ваш код, я так понял Вы мой привели в "божеский" вид, спасибо и за это!!!!

Последний раз редактировалось Palomnik1096; 09.12.2010 в 13:33.
Palomnik1096 вне форума Ответить с цитированием
Старый 09.12.2010, 14:40   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Kolvo показывет в кавычках, а minkol без кавычек, пытался понять, почему это так, но так не понял
потому что InputBox возвращает строку.
устранить несоответствие можно несколькими путями:
1.показан в коде - конвертировать строку в число (в примере в Double)
Kolvo = CDbl(InputBox("Введите количество приобретаемого товара", "Количество товара"))
2.хорошая практика обьявлять типы переменных.
Dim Kolvo as Double
...
Kolvo = InputBox("Введите количество приобретаемого товара", "Количество товара")
в этом случае Бейсик сам приведет тип к "правильному". если InputBox вернул "27", то Kolvo станет равно 27. В случае без обьявления типов Kolvo получало тип соответствующий результату функции InputBox, а это строка.

Цитата:
привели в "божеский" вид
крепко не наяривал, но немного "причесал".
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 09.12.2010, 14:56   #6
Palomnik1096
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 83
По умолчанию

2.хорошая практика обьявлять типы переменных.
Dim Kolvo as Double



В 99% случаев всегда объявляю (по книжке ведь учусь, а там как написано так и делаю), но в этот раз просто было лень кучу переменных писать, вот и поплатился за лень, два дня мучился с этой программой!!!!
Palomnik1096 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автофильтр (AutoFilter), как отфильтровать данные все кроме.? SAIIIA.P Microsoft Office Excel 8 30.06.2022 19:33
Обрезать все кроме цифр, Дельфи TorchWood Работа с сетью в Delphi 8 01.08.2015 17:36
Как скрыть все листы в ЕКСЕЛЕ кроме определенного списка sasha_prof Microsoft Office Excel 2 03.12.2010 21:09
Закрыть все файлы Excel,кроме текущего BesTiYa Microsoft Office Excel 5 10.12.2009 12:53
Написал программу, помогите натянуть Шейдеры или как нибудь модифицировать программу WMLite Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2009 13:57