Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 23.11.2020
Сообщений: 27
Excel

Неправильно работает IF в VBA и удаление строк в диапазоне

06.12.2020, 12:31. Показов 2405. Ответов 13

Студворк — интернет-сервис помощи студентам
Доброе время суток, уважаемые форумчане и коллеги!

Написал код для калькулятора расчета рейтингов. Однако, я был бы не я, если бы мой код работал as intended.

В данном случае, следующие проблемы:

1. Не работающий IF (если):

• «K1» повторяется дважды: в ячейках «С25» и «С48», притом значение в «С25» неправильное. Должно возвращаться только значение в ячейке «С48»
• Доля Ф/Л повторяется дважды: в ячейках «С33» и «С46», притом значение в «С33» неправильное. Должно возвращаться только значение в ячейке «С46»
• Значение «Покрытие ОКУ» в ячейке «С30» неправильное

Вот часть кода, которая, по-моему содержит ошибки:


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
'Повышающие факторы
 
 
If K1Result = 2 Or K1Result = 1.5 Then
Range("C25").Value = VR(K1TextBox.Text)
End If
 
If K4Result = 2 Or K4Result = 1.5 Then
Range("C26").Value = VR(K4TextBox.Text)
End If
 
If ProsrochkaResult = 2 Or ProsrochkaResult = 1.5 Then
Range("C27").Value = VR(ProsrochkaTextBox)
End If
 
If APLResult = 1.5 Then
Range("C27").Value = Val(x)
End If
 
If ProsrochkaResult = 2 Or ProsrochkaResult = 1.5 Then
Range("C28").Value = VR(ProsrochkaTextBox)
End If
 
If NPLResult = 2 Or NPLResult = 1.5 Then
Range("C29").Value = VR(NPLTextBox.Text)
End If
 
If OKUResult = 2 Or OKUResult = 1.5 Then
Range("C30").Value = OKUTextBox
End If
 
If RostAktivovResult = 2 Or RostAktivovResult = 1.5 Then
Range("C31").Value = RostAktivovTextBox
End If
 
If RostSpResult = 1.5 Then
Range("C32").Value = RostspTextBox
End If
 
If FLResult = 1.5 Then
CellFL = FLperTextBox
Range("C33").Value = CellFL
End If
 
If SIFIResult = 0.5 Or SIFIResult = 1 Then
Range("C34").Value = RazmerBox1
End If
 
If DefaultTextBox = 0 Then
Range("C35").Value = "Не было дефолта"
End If
 
If AdjPcTextBox = 0.15 Then
Range("C36").Value = "Высокий рейтинг родительской организации"
End If
 
If AdjPcTextBox = 0.1 Then
Range("C36").Value = "Средний рейтинг родительской организации"
End If
 
If AdjPcTextBox = 0.05 Then
Range("C36").Value = "Низкий рейтинг родительской организации"
End If
 
 
'Нейтральные факторы
 
If K1Result = 1 Then
Range("C38").Value = VR(K1TextBox.Text)
End If
 
If K4Result = 1 Then
Range("C39").Value = VR(K4TextBox.Text)
End If
 
If APLResult = 1 Then
Range("C40").Value = VR(x)
End If
 
If ProsrochkaResult = 1 Then
Range("C41").Value = VR(ProsrochkaTextBox)
End If
 
If NPLResult = 1 Then
Range("C42").Value = VR(NPLTextBox.Text)
End If
 
If OKUResult = 1 Then
Range("C43").Value = OKUTextBox
End If
 
If RostAktivovResult = 1 Then
Range("C44").Value = RostAktivovTextBox
End If
 
If RostSpResult = 1 Then
Range("C45").Value = RostspTextBox
End If
 
If FLResult = 1 Then
CellFL = FLperTextBox
Range("C46").Value = CellFL
End If
'Понижающие
 
If K1Result = 0.5 And K1Result = 0 Then
Range("C48").Value = VR(K1TextBox.Text)
End If
 
If K4Result = 0.5 And K4Result = 0 Then
Range("C49").Value = VR(K4TextBox.Text)
End If
 
If APLResult = 0.5 And APLResult = 0 Then
Range("C50").Value = VR(x)
End If
 
If ProsrochkaResult = 0.5 And ProsrochkaResult = 0 Then
Range("C51").Value = VR(ProsrochkaTextBox)
End If
 
If NPLResult = 0.5 And NPLResult = 0 Then
Range("C52").Value = VR(NPLTextBox.Text)
End If
 
If OKUResult = 0.5 And OKUResult = 0 Then
Range("C53").Value = OKUTextBox
End If
 
If RostAktivovResult = 0.5 And RostAktivovResult = 0 Then
Range("C54").Value = RostAktivovTextBox
End If
 
If RostSpResult = 0.5 And RostSpResult = 0 Then
Range("C55").Value = RostspTextBox
End If
 
If FLResult = 0.5 And FLResult = 0 Then
CellFL = FLperTextBox
Range("C56").Value = CellFL
End If
 
If SIFIResult = 0 Then
Range("C57").Value = RazmerBox1
End If
 
If DefaultTextBox = -0.025 Then
Range("C58").Value = "Нефинансовая помощь государства"
End If
 
If DefaultTextBox = -0.05 Then
Range("C58").Value = "Дефолт"
End If
 
If AdjPcTextBox = 0 Then
Range("C59").Value = "Нет Родительской Организации"
End If

Заранее извиняюсь за проблемы с кириллицей (хотя Excel файле на нескольких компьютерах открывается без кваказябр)



Во всех случаях неправильного значения, возвращается почти что всегда 1.

Перепробовал разные тестовые данные, но проблема остается.

2. Удаление строк:

Ну и последняя проблема – я взял с интернета код для удаления строк в заданном диапазоне (range) если определенные ячейке пустые. Пробовал менять диапазон – не выходит.

Вот код

Python
1
2
3
4
5
6
7
8
9
10
Sub sbVBS_To_Delete_Blank_Rows_In_Range()
 
 
Dim iCntr
Dim rng As Range
Set rng = Range("Ñ25:C60")
 
    For iCntr = rng.Row + rng.Rows.Count - 1 To rng.Row Step -1
        If Application.WorksheetFunction.CountA(Rows(iCntr)) = 0 Then Rows(iCntr).EntireRow.Delete
    Next
В Архиве – сам файл и тестовые данные к нему
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2020, 12:31
Ответы с готовыми решениями:

Поиск по конкретному слову в конкретном диапазоне работает неправильно
Задаю поиск по конкретному слову в конкретном диапазоне и все это зацикливаю, но Excel находит не то что задали в поиске, а все строки...

Удаление пустых строк в диапазоне
Ребят, у меня опять проблемы по невнимательности. Написал тут Private Sub CommandButton1_Click() Dim ra As Range, delra As Range ...

Функция в VBA Excel работает неправильно.
Привет ! при попытке присвоить значение ячейке функция выдаёт #ЗНАЧ! Public Function функция() As Byte ...

13
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
06.12.2020, 13:50
NauanS,
Архив не прикреплен

Добавлено через 1 минуту
NauanS,
Кто писал вам код?

Добавлено через 1 минуту
Если вы сами- то вопросов, которые вы выставили ( кроме последнего) не возникло бы.

Добавлено через 1 минуту
Посмотрите ваше условие строка 106 и внимательно подумайте, что здесь не так..
Цитата Сообщение от NauanS Посмотреть сообщение
If K1Result = 0.5 And K1Result = 0 Then
Range("C48").Value = VR(K1TextBox.Text)
End If
If K4Result = 0.5 And K4Result = 0 Then
Range("C49").Value = VR(K4TextBox.Text)
End If
If APLResult = 0.5 And APLResult = 0 Then
Range("C50").Value = VR(x)
End If
Добавлено через 1 минуту
Как может быть истиной выражение ?
X=0.5 И X=0
1
0 / 0 / 0
Регистрация: 23.11.2020
Сообщений: 27
06.12.2020, 13:53  [ТС]
Narimanych, код писался коллективно

Вижу ошибку в коде). Спасибо!

Прикладываю архив к сообщению
Вложения
Тип файла: zip Калькулятор и тестовые данные.zip (55.7 Кб, 7 просмотров)
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
06.12.2020, 13:58
NauanS,
Цитата Сообщение от NauanS Посмотреть сообщение
сли определенные ячейке пустые.
Какие?
0
0 / 0 / 0
Регистрация: 23.11.2020
Сообщений: 27
06.12.2020, 14:02  [ТС]
Python
1
С2560
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
06.12.2020, 14:17
Лучший ответ Сообщение было отмечено NauanS как решение

Решение

NauanS,
Цитата Сообщение от NauanS Посмотреть сообщение
код для удаления строк в заданном диапазоне (range)
Цитата Сообщение от NauanS Посмотреть сообщение
С25:С60

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub MMM()
Application.ScreenUpdating = False
    With ThisWorkbook.Sheets("Калькулятор")
       For i = 60 To 25 Step -1
            If IsEmpty(Cells(i, 3)) Then
             If Not Cells(i, 3).MergeCells Then Rows(i).Delete
            End If
       Next
    End With
 Application.ScreenUpdating = True
End Sub
1
0 / 0 / 0
Регистрация: 23.11.2020
Сообщений: 27
06.12.2020, 14:37  [ТС]
Я обновил файл согласно вашим рекомендациям, теперь нет проблем со значениями, но строчки не удаляются. Приложил обновленный файл
Вложения
Тип файла: rar Калькулятор и тестовые данный New.rar (55.7 Кб, 9 просмотров)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
06.12.2020, 15:56
Цитата Сообщение от NauanS Посмотреть сообщение
но строчки не удаляются.
- расскажите как Вы этот код вызываете, я не нашёл.
Но в любом случае строки удаляются, если его поместить в стандартный модуль.
Только строка
Visual Basic
1
    With ThisWorkbook.Sheets("Калькулятор")
смысла не имеет, т.к. в коде не используется.
1
0 / 0 / 0
Регистрация: 23.11.2020
Сообщений: 27
06.12.2020, 16:17  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
- расскажите как Вы этот код вызываете, я не нашёл.
Но в любом случае строки удаляются, если его поместить в стандартный модуль.
Только строка
Я думал это в том же userform оставить

Мне просто нужно чтобы ТОЛЬКО после расчета всех показателей, удалялись пустые строчки

Добавлено через 45 секунд
Цитата Сообщение от NauanS Посмотреть сообщение
Мне просто нужно чтобы ТОЛЬКО после расчета всех показателей, удалялись пустые строчки
Как это как раз сделать?

Куда нужно вставлять код?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
06.12.2020, 17:35
Ну можно и там оставить, только вызов макроса сделайте, и укажите на каком листе будете применять. Правильно укажите!

Добавлено через 5 минут
Проверил, работает - всего лишь добавил вызов на форме и точки в код.
Visual Basic
1
2
3
            If IsEmpty(.Cells(i, 3)) Then
                If Not .Cells(i, 3).MergeCells Then .Rows(i).Delete
            End If
1
06.12.2020, 17:47

Не по теме:

Цитата Сообщение от NauanS Посмотреть сообщение
Не работающий IF
- срочно сообщите в Microsoft! В VBA ошибка!

0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
06.12.2020, 18:27
Лучший ответ Сообщение было отмечено NauanS как решение

Решение

NauanS,
Цитата Сообщение от NauanS Посмотреть сообщение
Куда нужно вставлять код?
Посмотрите файл:
Вложения
Тип файла: rar Calculator MainFrame - New Rev1.rar (41.6 Кб, 8 просмотров)
0
0 / 0 / 0
Регистрация: 23.11.2020
Сообщений: 27
07.12.2020, 08:21  [ТС]
Спасибо!
Сработало!
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
07.12.2020, 09:33
NauanS,
Цитата Сообщение от NauanS Посмотреть сообщение
Спасибо!
Сработало!
Велкоме
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2020, 09:33
Помогаю со студенческими работами здесь

Удаление пустых строк в определенном диапазоне
Ситуация следующая: есть, например, таблица - некоторые строки в ней заполнены, некоторые пустые. Стоит задача - удалить пустые строки. При...

Удаление строк, не содержащих нужного значения в выбранном диапазоне
Подскажите, пожалуйста, ни у кого нет такого макроса: Выделяется диапазон, например, N1:N20. В нем просматриваются ячейки на...

Неправильно работает удаление из файла
Нужно чтобы удаляло найденные данные, а удаляет всё, кроме найденного вот кусочек кода: Созданный ранее файл называется residents.dat ...

Неправильно работает удаление записей
Здравствуйте. Есть несложный код для добавления и удаления записей из БД, но когда нажимается кнопка "Удалить" _POST передает в...

Случайное число в VBA без повтора в диапазоне, работает по нажатию кнопки
Недавно начал изучение и использование VBA в Power Point. Возникла задача: нужно чтобы по нажатию кнопки генерировалось случайное число,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru