Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 3
Регистрация: 12.10.2015
Сообщений: 37
1

Пользовательские функции VBA обновление при закрытой книге

09.11.2015, 20:31. Показов 1572. Ответов 8
Метки нет (Все метки)

Добрый вечер.

Есть некая функция, не важно какая (ниже просто пример), которая берет данные из другой книги.
Но только все работает пока вторая книга открыта, как только она закрывается функция не срабатывает и вместо значений получаем ошибку.
Как можно исправить этот недостаток и сделать функцию полноценной, так что бы значения обновлялись при закрытой книге и конечно же функция не слетала при закрытии второй книги.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function other(Range1 As Range, Value1 As Integer, Value2 As Integer)
compare = 0
For i = 1 To Range1.Rows.Count
    If Range1.Cells(i, 1) = Value1 Then
        compare = compare + 1
        If compare = Value2 Then
            other = Range1.Cells(i, 1)
            Exit For
        End If
    End If
    If i = 2000 Then
        Exit For
    End If
Next
End Function
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2015, 20:31
Ответы с готовыми решениями:

Как использовать пользовательские функции при указании диапазонов допустимых значений. Excel+VBA
В общем, идея была простая. Для создания выпадающего списка из допустимых значений нужен источник...

Sheets.count в закрытой книге Excel...
Привет всем! Недавно была похожая тема, но там не касались вопроса перебора по листам закрытой...

Запрос наличия листа в закрытой книге
Здравствуйте. прошу помощи. Задача - узнать есть ли определенный лист в закрытой книге без его...

Поиск значения в закрытой книге и выведение значений строки
Добрый день. Помогите пожалуйста. Есть Ecxel файл с набором данных который расположен в сети....

8
6859 / 2794 / 529
Регистрация: 19.10.2012
Сообщений: 8,524
09.11.2015, 21:18 2
Лучший ответ Сообщение было отмечено pythonUser как решение

Решение

Цитата Сообщение от pythonUser Посмотреть сообщение
Есть некая функция, не важно какая
Ну тогда изучайте такую, которая работает и с закрытыми книгами:
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
Function VLOOKUPCOUPLE(Table As Variant, _
                       SearchColumnNum As Integer, _
                       SearchValue As Variant, _
                       RezultColumnNum As Integer, _
                       Separator_ As String, _
                       Optional BezPovtorov As Boolean = True)
 
'Table - таблица, где ищем
'SearchColumnNum - столбец, где ищем
'SearchValue - данные, которые ищем
'RezultColumnNum - столбец, откуда берём результат
'Separator_ - разделитель, желательно вводить с пробелом в конце
'BezPovtorov - если поставить 0, то будут выведены все повторяющиеся совпадения
 
    Dim i As Long, tmp As String, vlk
 
    If TypeName(Table) = "Range" Then Table = Intersect(Table.Parent.UsedRange, Table).Value
    If BezPovtorov Then
        With CreateObject("Scripting.Dictionary")
            For i = 1 To UBound(Table)
                If Table(i, SearchColumnNum) = SearchValue Then
                    tmp = Table(i, RezultColumnNum)
                    If tmp <> "" Then
                        If Not .Exists(tmp) Then
                            .Add tmp, 0&
                            vlk = vlk & Separator_ & Table(i, RezultColumnNum)
                        End If
                    End If
                End If
            Next i
        End With
    Else
        For i = 1 To UBound(Table)
            If Table(i, SearchColumnNum) = SearchValue Then
                vlk = vlk & Separator_ & Table(i, RezultColumnNum)
            End If
        Next i
    End If
    If vlk > 0 Then vlk = Mid(vlk, Len(Separator_) + 1) Else vlk = ""
    VLOOKUPCOUPLE = vlk
End Function
2
15038 / 6362 / 1726
Регистрация: 24.09.2011
Сообщений: 9,971
09.11.2015, 21:18 3
Цитата Сообщение от pythonUser Посмотреть сообщение
Как можно исправить этот недостаток и сделать функцию полноценной, так что бы значения обновлялись при закрытой книге
Прежде всего, передавать в функцию полный путь к книге, имя (или номер) листа и адрес диапазона.
А в функции проверять, не открыта ли эта книга, и если не открыта, то открывать. Это удобно делать с помощью функции GetObject (поищите по форуму).
0
0 / 0 / 3
Регистрация: 12.10.2015
Сообщений: 37
09.11.2015, 22:12  [ТС] 4
Большое спасибо всем
0
6859 / 2794 / 529
Регистрация: 19.10.2012
Сообщений: 8,524
09.11.2015, 22:35 5
Вообще-то мне рано спасибо говорить - что-то не работает мой пример в 2010... Хотя точно помню что в 2003 всё работало с закрытыми книгами.
0
0 / 0 / 3
Регистрация: 12.10.2015
Сообщений: 37
24.11.2015, 15:36  [ТС] 6
У меня эта функция работает только медленно как-то очень, долго выполняется пересчет. Может есть Идеи как ее оптимизировать? Я ее уже всяко покрутил, пока не получается. Вроде простой цикл и никак не увеличить скорость...
0
6859 / 2794 / 529
Регистрация: 19.10.2012
Сообщений: 8,524
24.11.2015, 16:43 7
Цитата Сообщение от pythonUser Посмотреть сообщение
У меня эта функция
- какая? Тут которая просто пример можно наоптимизировать вдоль и поперёк, как минимум 2 раза
0
0 / 0 / 3
Регистрация: 12.10.2015
Сообщений: 37
24.11.2015, 20:57  [ТС] 8
PureBasic
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
Function VLOOKUPCOUPLE(Table As Variant, _
                       SearchColumnNum As Integer, _
                       SearchValue As Variant, _
                       RezultColumnNum As Integer, _
                       Separator_ As String, _
                       Optional BezPovtorov As Boolean = True)
 
'Table - таблица, где ищем
'SearchColumnNum - столбец, где ищем
'SearchValue - данные, которые ищем
'RezultColumnNum - столбец, откуда берём результат
'Separator_ - разделитель, желательно вводить с пробелом в конце
'BezPovtorov - если поставить 0, то будут выведены все повторяющиеся совпадения
 
    Dim i As Long, tmp As String, vlk
 
    If TypeName(Table) = "Range" Then Table = Intersect(Table.Parent.UsedRange, Table).Value
    If BezPovtorov Then
        With CreateObject("Scripting.Dictionary")
            For i = 1 To UBound(Table)
                If Table(i, SearchColumnNum) = SearchValue Then
                    tmp = Table(i, RezultColumnNum)
                    If tmp <> "" Then
                        If Not .Exists(tmp) Then
                            .Add tmp, 0&
                            vlk = vlk & Separator_ & Table(i, RezultColumnNum)
                        End If
                    End If
                End If
            Next i
        End With
    Else
        For i = 1 To UBound(Table)
            If Table(i, SearchColumnNum) = SearchValue Then
                vlk = vlk & Separator_ & Table(i, RezultColumnNum)
            End If
        Next i
    End If
    If vlk > 0 Then vlk = Mid(vlk, Len(Separator_) + 1) Else vlk = ""
    VLOOKUPCOUPLE = vlk
End Function
Ваша функция...
0
6859 / 2794 / 529
Регистрация: 19.10.2012
Сообщений: 8,524
24.11.2015, 21:05 9
Тут нечего оптимизировать. Но если в таблицу на миллион строк забиваете миллион таких функций, которые шерстят другую таблицу на миллион строк, и обе шириной на сотню столбцов - тогда конечно будет долго....
Но тогда можно пооптимизировать "на предмет" брать вторую таблицу в два отдельных массива, чтоб и массивы создавались быстрее, и памяти ело меньше.
Но т.к. такие случаи редкость и пока не встречались - думаю не нужно оптимизировать... Будет случай - можно сделать по спецпросьбе. Но не сейчас...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2015, 21:05

Поиск, копирование, переход на две ячейки в бок в закрытой книге
Sub copy2() Workbooks.Open &quot;D:\221373.xls&quot; Cells.Find(What:=&quot;word&quot;, After:=ActiveCell,...

Не работает макрос VBA при общем доступе к книге
Суть проблемы: есть книга excel с макросами vba. К книге установлен общий доступ (ну чтобы...

В Excel при использовании через VBA автофильтра и затем его отмены на листе исчезают пользовательские формы
В Excel при использовании через VBA автофильтра и затем его отмены на листе исчезают...

Управлять с помощью VBA закрытой книгой, которая находится на локальном сервере
Приветствую! Ребят, нужна помощь в теоретическом вопросе. Я не силен в VBA и программировании в...

Обновление статус бара в MS Access при выполнении кода VBA
Есть код открытия книги Excel, оттуда берутся данные и заносятся в базу, данных много, поэтому для...

Вызов закрытой функции
#include &lt;iostream&gt; class A { public: virtual void f() { std::cout &lt;&lt; &quot;A&quot;; } }; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru