Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297

Частный случай сохранения значения переменной после цикла

02.01.2025, 20:09. Показов 720. Ответов 12

Студворк — интернет-сервис помощи студентам
Всех причастных - с Новым годом!
Здравствуйте. Требуется помощь зала, не могу сохранить значение переменной Результат1 для вывода в MsgBox в рамках процедуры.
При Public - Error 424 Object Required, при Static - пусто (Set есть, синтаксис?). Перебрал все легкодоступные варианты, но..

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
'---------------------------------------------------------------------------------------
' Purpose   : Процедура заполнения ячеек на двух листах второй закрытой книги общего пользования на сервере [Динамика ...xlsx]
'             с подтверждением заполнения (выводом результата заполнения в (ячейки первой книги - сейчас) а надо - в MsgBox).
'---------------------------------------------------------------------------------------
 
'Public Результат1  As Range, Результат2 As Range  'объявил Глоб.переменные, должны быть доступны в любой процедуре проекта
 
Sub ЗаполнитьОтчётВФоне()
    Dim Кол_воКлаймов As String        'объявил локальную переменную
    Кол_воКлаймов = Range("AX3")        'значение для переменной беру из листа [Лист1] книги [Шапка_5.xlsm], или из:
'        Кол_воКлаймов = InputBox("Количество отработанных клаймов:", "Заполнение Динамики", "Введите значение", 13000, 6000)  'присвоил переменной значение из InputBox
    
    '    Application.DisplayAlerts = False 'оператор VBA для отключения системных сообщений - не нужен
    '    Application.EnableEvents = False 'оператор VBA для отключения событий [применяется ко всем рабочим книгам одновременно!] - не нужен
    
    Dim wb1         As Excel.Workbook, wb2 As Excel.Workbook        'объявил переменные для книг [Шапка_5.xlsm] и [Динамика..xlsx]
    Set wb1 = Workbooks.Open("C:\Users\Имя\Desktop\Папка1\Шапка_5.xlsm")        ' закомментишь- не работает при открытой книге(?)
    Range("AY3").ClearContents        'не важно зачем
    Application.ScreenUpdating = False        'оператор VBA для отключения обновления экрана (=ускорение), он же фоновый режим(?))
    
    Call IsBookOpen("wbFullName")        ' подключаю функцию проверки на открытость/закрытость книги
    Set wb2 = Workbooks.Open("C:\Users\Имя\Desktop\Папка1\Динамика...xlsx")
    
    Dim sht         As Worksheet        'объявил переменную для листов
    Set sht21 = wb2.Worksheets("декабрь 2024")        'установил ссылку на лист [декабрь 2024] [Динамика..xlsx]
    Set sht22 = wb2.Worksheets("учет декабрь 2024")        'установил ссылку на лист [учет декабрь 2024] [Динамика..xlsx]
    Set sht11 = wb1.Worksheets("Лист1")        'установил ссылку на лист [Лист1] книги [Шапка_5.xlsm]
    
    'РАБОТАЮ ПЕРВЫЙ ЛИСТ--------------------------------------------------------------------------------------------------------
    
    sht21.Activate        'активировал  лист [декабрь 2024] [Динамика...xlsx]
    Dim strAddress  As String        'объявил переменную для адреса ячейки
    Static Результат1 As Range, Результат2 As Range        ' - не помогает, Вывод_Результатов_в_MsgBox пусто
    Dim Rng         As Range        'объявил переменную
    Dim dtToday     As Date        'объявил переменную для СЕГОДНЯ()
    dtToday = Date
    'начинаю искать ячейку по условию:
    Dim Cl          As Range, Iskomoe$        'объявил переменную
    Iskomoe = "Иванов И.И."
    Iskomoe = "*" & LCase(Iskomoe) & "*"
    For Each Cl In Range("B2:B130" & Range("B2").End(xlDown).Row)        ' ... Range("B2:B")... - почему-то не катит
        If LCase(Cl) Like Iskomoe And Cl.Offset(, -1) = dtToday Then Cl.Select        'выделил найденную ячейку
    Next
    
    If Not Intersect(ActiveCell, Range("B4:B130")) Is Nothing Then
        Cells(ActiveCell.Row, 30).Value = Кол_воКлаймов
        Cells(ActiveCell.Row, 30).Select
        strAddress = ActiveCell.Address        '   выделил активную ячейку, она же 'Целевая ячейка1
        Set Результат1 = Range(ActiveCell.Address)        '    Set ! и все равно переменная обнуляется... :(
        Debug.Print "Aдрес актив яч-1 = "; (ActiveCell.Address)
        Debug.Print "Результ-1 = "; Результат1
    End If
    
    sht11.Activate        'активировал  лист [Лист1] книги [Шапка_5.xlsm]
    Range("AY3").Value = Результат1        'сохраняю в ячейку листа [Лист1] книги [Шапка_5.xlsm], а хочу вывести в MsgBox
    Range("AX3").ClearContents        'не важно
    sht21.Activate        'wb2.Sheets("декабрь 2024").Activate ' снова активировал  лист [декабрь 2024] [Динамика...xlsx]
    Set Rng = Range("A1:AQ108").Find(what:=Результат1, LookIn:=xlValues, lookAt:=xlWhole)        'здесь What:=Результат1 — искомое значение, LookIn:=xlValues — поиск по значениям ячеек, LookAt:=xlWhole — полное совпадение.
    If Not Rng Is Nothing Then
        '        MsgBox "Нашли!"
        Rng.Select
    Else
        MsgBox "Не найдено."
    End If
    Range("AR19").Activate        ' отойду в сторонку)
    
    'РАБОТАЮ ВТОРОЙ ЛИСТ----------------------------------------------------------------------------------------------------------
    
    sht22.Activate        'активировал  лист [учет декабрь 2024] [Динамика...xlsx]
    
    For Each Cl In Range("B2:B108" & Range("B2").End(xlDown).Row)
        If LCase(Cl) Like Iskomoe And Cl.Offset(, -1) = dtToday Then Cl.Select
    Next
    
    If Not Intersect(ActiveCell, Range("B4:B108")) Is Nothing Then
        Cells(ActiveCell.Row, 7).Value = Кол_воКлаймов        'Целевая ячейка2
        Cells(ActiveCell.Row, 7).Select
        strAddress = ActiveCell.Address
        Set Результат2 = Range(ActiveCell.Address)
        Debug.Print "Aдрес актив яч-2 = "; (ActiveCell.Address)
        Debug.Print "Результ-2 = "; Результат2
    End If
    
    Set Rng = Range("A1:AQ130").Find(what:=Результат2, LookIn:=xlValues, lookAt:=xlWhole)
    If Not Rng Is Nothing Then
        '        MsgBox "Нашли!"
        Rng.Select
    Else
        MsgBox "Не найдено."
    End If
    Range("A1").Activate        'отойду в сторонку,
    wb2.Worksheets("ноябрь 2024").Activate        'затем вообще на лист [ноябрь 2024] wb [Динамика...xlsx]
    Range("AE11:AQ37").Select        ')
    Workbooks("Динамика.....xlsx").Save        ' сохраняю изменения в wb
    Set wb = Nothing        'удаляю присвоенное значение переменной Workbook
    Workbooks("Динамика .......xlsx").Close SaveChanges:=False        'закрываю wb без сохранения
    Application.ScreenUpdating = True        'включаю обновление экрана.
    
    '    MsgBox "The value of the target cell in the worksheet [декабрь 2024] = " & Результат1
    
    Call Вывод_Результатов_в_MsgBox
    
End Sub
 
Sub Вывод_Результатов_в_MsgBox()
    MsgBox "The value of the target cell in the worksheet [декабрь 2024] = " & Результат1        'при Public - Error 424 Object Required, (Set есть, синтаксис?). При Static - пусто
    'MsgBox "The value of the target cell in the worksheet [декабрь 2024] = " & Результат1 & _
    '    vbNewLine & "Значение целевой ячейки на листе [учет декабрь 2024] = " & Результат2, vbOKOnly, _
    '    "Проверка заполнения ячеек на двух листах файла [Динамика...]"
End Sub
Стаж VBA - 1 месяц. Сильно не критикуйте)
Рефакторинг и оптимизация приветствуется.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2025, 20:09
Ответы с готовыми решениями:

Вывод на экран значения переменной j после окончания цикла
using System; class Cicly2 { static void Main() { for (int i = 0; i < 10; i++) { Console.WriteLine("\n i= {0}",...

Частный случай
Добрый день! В ходе решения задачи в общем виде нужно было сосчитать интеграл по объему от набла*(А*u), где А - тензор, u - вектор....

Контекст, частный случай
Речь идет о диалоговой программе с элементами ИИ. Что такое контекст? Если ответить своими словами, то это текст определяющий ...

12
Заблокирован
02.01.2025, 20:23
Если ты хочешь использовать переменную Результат1 в нескольких процедурах, нужно объявить её в начале модуля, чтобы она была доступна во всём модуле. При этом указывать Public не обязательно, лучше использовать Private или просто оставить без этого слова.
например:
Visual Basic
1
Private Результат1 As Range
Когда ты хочешь вывести значение из этой переменной через MsgBox, нужно обращаться к свойству .Value, так как Результат1 — это объект типа Range . Если не указать .Value, может возникнуть ошибка или быть передана другая информация.
ппример:
Visual Basic
1
MsgBox Результат1.Value
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4136 / 2430 / 503
Регистрация: 13.12.2016
Сообщений: 8,264
Записей в блоге: 5
02.01.2025, 20:30
ooos, Вы же текст хотите увидеть в MsgBox, а переменная As Range - а это диапазон ячеек
объявите хотя бы ваш результат текстом Результат1 As String, а лучше Variant
1
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
02.01.2025, 21:14  [ТС]
Цитата Сообщение от Ashki Посмотреть сообщение
MsgBox Результат1.Value
Ashki, Private Результат1 As Range - объявил,
Visual Basic
1
MsgBox Результат1.Value
прописал, но не работает
0
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
02.01.2025, 21:19  [ТС]
Цитата Сообщение от АЕ Посмотреть сообщение
а лучше Variant
АЕ, спасибо, объявил Variant , хоть он больше остальных память занимает, зато универсальный..
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4136 / 2430 / 503
Регистрация: 13.12.2016
Сообщений: 8,264
Записей в блоге: 5
02.01.2025, 21:22
Цитата Сообщение от ooos Посмотреть сообщение
хоть он больше остальных память занимает, зато универсальный..
Вы такой экономный или комп памятью обделен?
0
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
02.01.2025, 21:53  [ТС]
Цитата Сообщение от АЕ Посмотреть сообщение
Вы такой экономный или комп памятью обделен?
Неет, контора памяти 16 Гб выдала, а вот за электричество в этом случае ей придется доплачивать
ПС: надо загуглить: Крах корпораций по причине косвенных финансовых потерь из-за применения энергоемкого Variant

Добавлено через 27 минут
В общем, вылетает ошибка Runtime Error 424: "Object Required"
Возможные причины:
Кликните здесь для просмотра всего текста
Неправильное имя объекта, на который вы пытаетесь сослаться в коде.
Вы предоставили недопустимый квалификатор для объекта.
Оператор Set не использовался при назначении ссылки на объект.
Объект поврежден.
Отсутствующие объекты в книге.
Объекты, которые вы пытаетесь вызвать в коде, по ошибке удаляются или становятся недоступными.
Вы использовали неправильный синтаксис для объявления объекта.
Вы пытаетесь выполнить недопустимое действие над объектом в коде.
Книга повреждена.

Set Результат1 = ..... на месте,
Квалификатор объекта не распознаётся как объект? Возможно, что объект не виден в той части программы, в которой на него ссылаются?
0
428 / 332 / 61
Регистрация: 29.06.2019
Сообщений: 493
02.01.2025, 22:12
Цитата Сообщение от ooos Посмотреть сообщение
Set Результат1 = ..... на месте,
SET уберите.
0
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
02.01.2025, 22:15  [ТС]
Цитата Сообщение от SergioJek Посмотреть сообщение
SET уберите.
Убрал, не помогло...
0
428 / 332 / 61
Регистрация: 29.06.2019
Сообщений: 493
02.01.2025, 22:15
Лучший ответ Сообщение было отмечено ooos как решение

Решение

DIM Результат1 AS STRING

Результат1 ="ЧЕМУТО"

MSGBOX Результат1 '.VALUE
1
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
02.01.2025, 22:18  [ТС]
Цитата Сообщение от SergioJek Посмотреть сообщение
DIM Результат1 AS STRING
Результат1 ="ЧЕМУТО"
MSGBOX Результат1 '.VALUE
Ваааауу

Спасибо огромное! Пойду подумать-разобраться-почитать..
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
03.01.2025, 11:11
В догонку - если
Set Результат1 = диапазон
и этот диапазон будет не одна ячейка, то Результат1.value будет уже двумерным массивом, и msgbox ожидаемо ничего не покажет, вернее выпадет в ошибку.
1
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
03.01.2025, 19:12  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
В догонку - если
Set Результат1 = диапазон
Спасибо, Hugo121, вот значит какой ньюанс существует. Вывод диапазона я еще не применял, учту.
Если не сложно, прошу глянуть тему Метод Find затрудняется с поиском значения
Там опять проблема похожая, пустая переменная.
(Код, правда выделил в окне [QBASIC] а не[VB]), а 10 минут прошло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2025, 19:12
Помогаю со студенческими работами здесь

Запрос не срабатывает (частный случай)
Постараюсь всё изложить как можно понятнее. У меня есть форма я её заполняю и нажимаю на кнопку, чтобы сделать предварительный просмотр...

CRM системы. Частный случай
Добрый день! Хочу узнать некоторую информацию по CRM системам. Как по научному, называются системы, которые, например, на предприятиях, в...

Перегрузка методов (частный случай)
Доброго времени суток. Возник вопрос ответ на который не нашел в сети. Допустим имеем следующий перегруженный метод: public class...

Рекуррентное соотношение (частный случай )
В первые встречаюсь с таким

Частный случай симплекс метода
Доброго времени суток. Интересует информация по симплекс методу. Столкнулся с проблемой, связаной с тем, что опорный план (правая часть...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru