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

Многопоточность в VBA

22.08.2025, 02:07. Показов 6904. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, есть ли возможность сделать VBA многопоточным? Без dll и прочего, только кодом VBA и есть ли уже инструменты для этого?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.08.2025, 02:07
Ответы с готовыми решениями:

Многопоточность в VBA
Почему VBA? Про VB в принципе уже все давно расписано и исследовано за десятки лет. На VBA тема...

Купил книгу По VBA Программирование на VBA 2003 В.Г.Кузьменко
Поздравьте меня я купил книгу По VBA Программирование на VBA 2003 В.Г.Кузьменко, могу процитировать...

VBA Составить функцию VBA
помогите пожалуйста...

63
0 / 0 / 0
Регистрация: 22.08.2025
Сообщений: 10
25.08.2025, 11:03  [ТС]
Студворк — интернет-сервис помощи студентам
Ощущение, как будто нытики собрались, которым Google или ИИ сказал, что ничего нет по этой теме и начинают своё мнение неуместное высказывать (смешно)! Я же не прошу реализовать что-то за меня, а просто спросил про наличии данного решения! Чего нервничать-то)?

В общем и целом, если что-то найду, то дам знать (чтобы ещё больше разогреть и так горячие головы форумчан и посмотреть, что будет. Тема видимо для кого-то больная...)!

testuser2, Вам спасибо за идею и приложенный вариант кода! Пока это единственное, что полезно в этой теме!
0
0 / 0 / 0
Регистрация: 22.08.2025
Сообщений: 10
27.08.2025, 04:50  [ТС]
Дамы и господа, спор выигран, решение найдено на просторах рунета!
0
dive
 Аватар для I can
4976 / 4688 / 848
Регистрация: 13.04.2015
Сообщений: 9,900
27.08.2025, 06:56
Цитата Сообщение от AltцGamer Посмотреть сообщение
testuser2, Вам спасибо за идею и приложенный вариант кода
Этот код пытается эмулировать асинхронное выполнение задач в Excel с помощью VBA. Он использует подход с событиями и классами для запуска нескольких задач одновременно и отслеживания их выполнения, но фактически выполняет задачи последовательно, так как VBA сам по себе не поддерживает многопоточность. Код предполагает создание отдельных Excel процессов для выполнения задач и синхронизируется через события.

Цитата Сообщение от AltцGamer Посмотреть сообщение
спор выигран,
Поздравляю. Код покажешь?
0
0 / 0 / 0
Регистрация: 22.08.2025
Сообщений: 10
27.08.2025, 07:23  [ТС]
I can, круто конечно, что умеете пользоваться ИИ, но она дала не точный ответ!

VBA не поддерживает многопоточность в стандартном виде, но если мы создаём отдельные процессы и в каждом процессе запускаем код, то мы получаем потоки, которые выполняются параллельно, а не последовательно! С точки зрения ОС - это многопоточность, но без межпоточного взаимодействия в стандартном её понимании!

Цитата Сообщение от I can Посмотреть сообщение
Поздравляю. Код покажешь?
Списываюсь с продавцом!
0
dive
 Аватар для I can
4976 / 4688 / 848
Регистрация: 13.04.2015
Сообщений: 9,900
27.08.2025, 07:27
Цитата Сообщение от AltцGamer Посмотреть сообщение
Списываюсь с продавцом!
Это сарказм?

Добавлено через 1 минуту
Цитата Сообщение от AltцGamer Посмотреть сообщение
решение найдено на просторах рунета!
Правила, пункт 4.10
Если вопрос был решен вами самостоятельно, отпишите об этом в своей теме - есть и другие люди, которые столкнутся с той же проблемой, и им поможет ваш ответ.
0
0 / 0 / 0
Регистрация: 22.08.2025
Сообщений: 10
27.08.2025, 07:45  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Это сарказм?
Нет, серьёзно! Решение платное, есть статья с разбором и даже документация! Всё по-взрослому!
0
1328 / 546 / 112
Регистрация: 29.03.2016
Сообщений: 1,332
27.08.2025, 15:29
Цитата Сообщение от AltцGamer Посмотреть сообщение
Решение платное
Умеют-же люди продавать.
Завидую.
1
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
30.08.2025, 08:14
Цитата Сообщение от AltцGamer Посмотреть сообщение
но какой у Вас опыт разработки?
10 лет.

Цитата Сообщение от AltцGamer Посмотреть сообщение
Почему с практической точки зрения - это хрень?
Потому, что трата времени на натягивания совы на глобус - нецелевое использование инструмента. Хотя рядом вагон и тележка более подходящих.

Цитата Сообщение от AltцGamer Посмотреть сообщение
если есть сложная и нестандартная задача
Так ты сам задачу сделал сложной и нестандартной. Это ли путь разработчика - самому себе усложнять жизнь?..
1
509 / 163 / 22
Регистрация: 04.10.2015
Сообщений: 646
30.08.2025, 09:19
Цитата Сообщение от Usaga Посмотреть сообщение
Так ты сам задачу сделал сложной и нестандартной. Это ли путь разработчика - самому себе усложнять жизнь?
Полностью согласен.
Очень часто приходится наблюдать, как из Excel пытаются запускать спутники
0
 Аватар для volodin661
6809 / 2307 / 350
Регистрация: 10.12.2013
Сообщений: 7,956
30.08.2025, 11:23
Цитата Сообщение от AltцGamer Посмотреть сообщение
Решение платное, есть статья с разбором и даже документация! Всё по-взрослому!
интересно, что ссылку не дал.


1) Как все знают, есть проект Apache POI ( https://poi.apache.org/ ), в котором на чистой Java реализовано чтение/запись MS-офисных документов и excel само собой в их числе;
поддерживаются оба формата ( старый XLS(технология OLE structured storage) и новый XLSX(технология OOXML) )
Исполнение формул реализовано, но исполнение VBA в общем виде не реализовано.
Можно реализовать в частном виде, а именно переписать руками данный конкретный VBA для данного листа на Java,
пользуясь тем обстоятельством, что, как правило, об'ем кода VBA невелик *.

2) Как все знают, у языка Java нет проблем с многопоточностью, так что, пользуясь данным обстоятельством, возможно и такое решение.



(*) Пример
Кликните здесь для просмотра всего текста

Вот такой VBA код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub test()
 Set this_sheet = ThisWorkbook.Worksheets("Sheet1")
 code_col = WorksheetFunction.Match("Code", this_sheet.Range("1:1"), 0)
 Debug.Print "code_col: " & code_col
 payee = "b"
 payee_count = WorksheetFunction.CountIf(this_sheet.Range("A:A"), payee)
 Debug.Print "payee_count: " & payee_count
 count_rows_in_region = this_sheet.Cells(1, 1).CurrentRegion.Rows.Count
 Debug.Print "count_rows_in_region: " & count_rows_in_region
End Sub
Вот его реализация на Java POI:
Java
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
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.formula.WorkbookEvaluator;
import org.apache.poi.ss.formula.eval.*;
 
public class ExcelEvaluateSomeFunctions{
 
 public static void main(String[] args) throws Exception {
  Workbook workbook = WorkbookFactory.create(new FileInputStream("MSExcelWithVBA.xlsm"));
  Sheet this_sheet = workbook.getSheet("Sheet1");
  CreationHelper helper = workbook.getCreationHelper();
 
  XSSFFormulaEvaluator formulaevaluator = (XSSFFormulaEvaluator)helper.createFormulaEvaluator();
  WorkbookEvaluator workbookevaluator = formulaevaluator._getWorkbookEvaluator();
  ValueEval valueeval = null;
 
  //code_col = WorksheetFunction.Match("Code", this_sheet.Range("1:1"), 0)
  double code_col = Double.NaN;
  valueeval = workbookevaluator.evaluate("MATCH(\"Code\", " + this_sheet.getSheetName() + "!1:1, 0)", null);
  if (valueeval instanceof NumberEval) {
   code_col = ((NumberEval)valueeval).getNumberValue();
  }
  System.out.println("code_col: " + code_col);
 
  //payee_count = WorksheetFunction.CountIf(this_sheet.Range("A:A"), payee)
  String payee = "b";
  double payee_count = Double.NaN;
  valueeval = workbookevaluator.evaluate("COUNTIF(" + this_sheet.getSheetName() + "!A:A, \"" + payee + "\")", null);
  if (valueeval instanceof NumberEval) {
   payee_count = ((NumberEval)valueeval).getNumberValue();
  }
  System.out.println("payee_count: " + payee_count);
 
  //count_rows_in_region = this_sheet.Cells(1, 1).CurrentRegion.Rows.Count
  //this is not possible since apache poi does not know the concept of CurrentRegion
  //best you could do:
  int count_rows_in_sheet = this_sheet.getLastRowNum()+1;
  System.out.println("count_rows_in_sheet: " + count_rows_in_sheet);
 
  workbook.close();
 }  
}
( https://stackoverflow.com/ques... o-java-poi )
0
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2
30.08.2025, 11:54
Цитата Сообщение от volodin661 Посмотреть сообщение
double code_col = Double.NaN;
А это там обязательно всегда делать или чудачество?
0
 Аватар для volodin661
6809 / 2307 / 350
Регистрация: 10.12.2013
Сообщений: 7,956
30.08.2025, 12:34
Цитата Сообщение от testuser2 Посмотреть сообщение
А это там обязательно всегда делать или чудачество?
тебе пора расти, testuser2, застрял ты в секте Свидетелей Ексель ( здесь и далее сексель),
а жизнь-то проходит.
0
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2
30.08.2025, 12:59
Цитата Сообщение от volodin661 Посмотреть сообщение
тебе пора расти
Это надо молодым, которые крутятся в колесе Сансары, а я словно Будда, который познал ничто )
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38204 / 21136 / 4310
Регистрация: 12.02.2012
Сообщений: 34,748
Записей в блоге: 14
30.08.2025, 12:59
AltцGamer, поздно присоединяюсь... Создать процесс из VBA можно почти наверняка. Создать поток - скорее всего. Хотя лично я "побаиваюсь" многопоточности в VB/VBA (после серьезных предупреждений Д. Эпплмана).
0
Эксперт по электронике
6876 / 3299 / 340
Регистрация: 28.10.2011
Сообщений: 12,951
Записей в блоге: 7
30.08.2025, 18:05
Цитата Сообщение от AltцGamer Посмотреть сообщение
С точки зрения ОС - это многопоточность
С точки зрения ОС это многозадачность.
Многопоточность это
свойство платформы (например, операционной системы, виртуальной машины и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно»
https://ru.wikipedia.org/wiki/Многопоточность
У вас же несколько процессов с одним потоком.
0
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2
06.09.2025, 08:08
Цитата Сообщение от testuser2 Посмотреть сообщение
Сделал примерчик
Там был немного унылый примерчик, но может быть и повеселее при определенных условиях
0
509 / 163 / 22
Регистрация: 04.10.2015
Сообщений: 646
06.09.2025, 09:14
testuser2
Я, может быть, и рассуждаю как человек неискушенный в таких процессах, но задаю себе вопрос, а зачем в Excel оно надо?
1
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2
06.09.2025, 09:55
Цитата Сообщение от andris2 Посмотреть сообщение
а зачем в Excel оно надо?
Из того, что первое приходит на ум: 1) обработка больших данных, 2) какие-то фоновые задачи, допустим какая-то динамическая подгрузка - типа прокручиваешь страницу, а данные динамически подгружаются. Если кто-то может предложить что-то более конкретное, тогда переадресую этот вопрос на них )
0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
06.09.2025, 10:14
testuser2, а Excel как к этим пунктам относится?)
0
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2
06.09.2025, 10:40
Цитата Сообщение от Usaga Посмотреть сообщение
а Excel как к этим пунктам относится?)
В Экселе обрабатывают большие данные.
Code
1
2
3
4
5
6
?rows.Count
 1048576 
?columns.Count
 16384 
?1048576#*16384#
 17179869184 ячеек - вместимость одного листа.
Добавлено через 7 минут
Если все ячейки заполнить значениями типа double (8 байт), то только значения займут в памяти
Code
1
2
3
?17179869184*8
?137438953472/1024/1024/1024
 128 гигобайт! Оо
Добавлено через 10 минут
Если очень захотеть можно в космос улететь! )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.09.2025, 10:40
Помогаю со студенческими работами здесь

Vba excel windows и vba excel Mac Os - Макинтош корявит шрифт
Всем привет, столкнулся с такой ситуацией. Макросы написаны на Excel 2016 Windows. Когда файл...

VBA парсер выдает ошибку vba excel Run-time error '-2147319783 (80028019) и "microsoft ожидает пока другое приложение за
Добрый день, делаю свой первый парсер. Выдает ошибку vba excel Run-time error '-2147319783...

XLL хранение и выполнение VBA кода, или защита VBA кода от просмотра
Мое почтение, джентльмены... Делал для себя инструмент позволяющий хранить уже наработанный VBA...

VBA compiler - Компиляция VBA проекта в DLL
Добрый день, жители форума! В процессе работы мне потребовалось вынести код из VBA Excel в DLL....

Как реализуется многопоточность в VB?
Подскажите плз как реализуется многопоточность в VB, если конечно здесь таковая имеется.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Гайд, как ворваться в вайб-кодинг в мае 2026
Noname2331 17.05.2026
Простите за получившееся полотно текста, я даже не знаю, как его разбить на главы. Тут, что называется, ни добавить ни убавить, одна сцена одним дублем. На моих глазах недавно случилось чудо. Как. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru