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

Присваивание значения ячейки данных из другой книги, если исходная ячейка пуста

13.07.2018, 06:28. Показов 927. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите разобраться с вопросом.
Задача в следующем:
Есть формат с 10 листами с разными формами. Часть ячеек заполнена формулами.
Есть данные от центров ответственности, представленные в заданном формате.
Необходимо скопировать из каждого листа книги центра ответственности только те ячейки, в которых в изначальном формате не было данных.
Под это дело пишу макрос, который выдает ошибку на строке:
Visual Basic
1
iReport.Workbooks(mSheet).Cells(iCounts, iCountc).Value = book.Workbooks(mSheet).Cells(iCounts, iCountc).Value
Вот полный код
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
Sub Проверка_формул_АЭ()
'  -------------------------------------------------------------
    Dim iReport As Workbook, iPath$
    Dim i&, sht As Worksheet
    Dim book As Workbook, Filial$
    Dim nSheet As Integer, mSheet
    Dim postfix&, iCount, iCounts As Integer, iCountc As Integer
'  -------------------------------------------------------------
    Application.ScreenUpdating = False
    Set iReport = ActiveWorkbook
    For postfix = 99 To -1 Step -1
    iPath = iReport.Path & "\" & iReport.Worksheets("ЦО").Cells(2, 1).Value & "\от филиала\" & iReport.Worksheets("ЦО").Cells(2, 1).Value & "_отчет _июнь_" & Format$(postfix, "00") & ".xls*"
    If Len(Dir(iPath)) Then Set book = Workbooks.Open(iPath): Exit For
    If postfix = -1 Then MsgBox "Файл отсутствует": iReport.Worksheets("ЦО").Range("E2").Value = "Файл отсутствует": Exit Sub
    Next
    Set sht = iReport.Worksheets("ЦО")
    For nSheet = 2 To 11
    mSheet = iReport.Worksheets("ЦО").Cells(nSheet, 9)
        For iCounts = 8 To 500
        If iReport.Worksheets(mSheet).Cells(iCounts, 4) = "" Then
            For iCountc = 4 To 16
            MsgBox iCountc & " " & iCounts
            iReport.Workbooks(mSheet).Cells(iCounts, iCountc).Value = book.Workbooks(mSheet).Cells(iCounts, iCountc).Value
            Next iCountc
            End If
        Next iCounts
    Next nSheet
    book.Close False
    Application.ScreenUpdating = True
 
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2018, 06:28
Ответы с готовыми решениями:

Удалить строку если опеределенная ячейка в ней пуста, если нет - оставить
Добрый день! Подскажите пожалуйста, как сделать: Есть лист excel, в котором находятся данные. Необходимо удалить все строки,...

Печатать лист, только если определенная ячейка не пуста
Доброй ночи !!! Ув.знатоки,в очередной раз потребовалась Ваша помощь.... Есть макрос,который выводит на печать несколько листов(из...

Если ячейка пуста - значение предыдущего столбца в список C
Добрый день! Есть два столбца таблицы соответствия A B, в B есть пустые ячейки. Если ячейка столбца B, то соответствующее ей значение из...

9
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
13.07.2018, 08:11
Giltis,

то вы подразумеваете под "форматом" и "формой" :
Цитата Сообщение от Giltis Посмотреть сообщение
Есть формат с 10 листами с разными формами.
0
0 / 0 / 0
Регистрация: 13.07.2018
Сообщений: 5
13.07.2018, 08:15  [ТС]
Narimanych, Есть файл с названием строк и столбцов, которые остаются неизменными и в других файлах. То же самое с названием листов. То есть, например, мы точно знаешь, что ячейка С8 в третьем листе - это лист БДР, выручка за год во всех файлах. Но сами листы внутри одной книги отличаются друг от друга. То есть лист 1 не равен листу 2, но равен листу 1 в другой книге.
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
13.07.2018, 09:57
Giltis,
Как я понимаю

1) У вас есть около 100 книг (файлов) с данными от филиала ( название в ячейке А2 активной книги)
начиная от : \от филиала\ААА_отчет _июнь_-01.xls*
\от филиала\ААА_отчет _июнь_00.xls*
---------------------------------------------
---------------------------------------------
и заканчивая \от филиала\ААА_отчет _июнь_99.xls*

2) Не понимаю, что вы делаете ( или хотите сделать) в строке 13 и 14 вашего кода.. Пожалуйста объясните..( скорей всего - они не нужны вообще)

После этого можно будет разбирать дальше.
0
0 / 0 / 0
Регистрация: 13.07.2018
Сообщений: 5
13.07.2018, 10:05  [ТС]
Narimanych, Нет, не совсем так. Филиалов около 10, ячейка А2 будет меняться вручную при копировании макроса.
А строки 11-14 - определение последней версии файла, т.к. сохраняются унифицированно, например: филиал_01, филиал_02 и т.д.

Доработал код, теперь он работает, но работает очень медленно. За час не справился и с одним файлом. И есть подозрение, что если у ячейки есть форматирование, он ее не считает пустой. Есть возможность ускорить работу макроса?

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
Sub Проверка_формул_АЭ()
'  -------------------------------------------------------------
    Dim iReport As Workbook, iPath$
    Dim i&, sht As Worksheet
    Dim book As Workbook, Filial$
    Dim nSheet As Integer, mSheet
    Dim postfix&, iCount, iCounts As Integer, iCountc As Integer
'  -------------------------------------------------------------
    Application.ScreenUpdating = False
    Set iReport = ActiveWorkbook
    For postfix = 99 To -1 Step -1
    iPath = iReport.Path & "\" & iReport.Worksheets("ЦО").Cells(2, 1).Value & "\от филиала\" & iReport.Worksheets("ЦО").Cells(2, 1).Value & "_отчет _июнь_" & Format$(postfix, "00") & ".xls*"
    If Len(Dir(iPath)) Then Set book = Workbooks.Open(iPath): Exit For
    If postfix = -1 Then MsgBox "Файл отсутствует": iReport.Worksheets("ЦО").Range("E2").Value = "Файл отсутствует": Exit Sub
    Next
    Set sht = iReport.Worksheets("ЦО")
    For nSheet = 2 To 11
    mSheet = iReport.Worksheets("ЦО").Cells(nSheet, 9)
        For iCounts = 8 To 500
        If iReport.Worksheets(mSheet).Cells(iCounts, 4) = "" Then
            For iCountc = 4 To 16
            If iReport.Worksheets(mSheet).Cells(iCounts, iCountc) = "" And iReport.Worksheets(mSheet).Cells(iCounts, iCountc).MergeCells = False Then
            book.Worksheets(mSheet).Cells(iCounts, iCountc).Copy
            iReport.Worksheets(mSheet).Cells(iCounts, iCountc).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            End If
            Next iCountc
        End If
        Next iCounts
    Next nSheet
    book.Close False
    Application.ScreenUpdating = True
 
End Sub
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
13.07.2018, 10:13
Giltis,
Цитата Сообщение от Giltis Посмотреть сообщение
определение последней версии файла
определяется по максимальному номеру ?

Добавлено через 1 минуту
и файлов точно не больше 99ти?
0
0 / 0 / 0
Регистрация: 13.07.2018
Сообщений: 5
13.07.2018, 10:17  [ТС]
Narimanych, Именно так. Обычно версий не больше пары десятков, поэтому поставил ограничение 99
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
13.07.2018, 10:30
Giltis,
Прикрепите файл-легче будет разобраться.
0
0 / 0 / 0
Регистрация: 13.07.2018
Сообщений: 5
13.07.2018, 11:16  [ТС]
Narimanych, К сожалению, там может быть информация, которую нежелательно разглашать. Верхняя часть кода работает как надо, вопрос вот по этому кусочку:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
 For iCounts = 8 To 500
        If iReport.Worksheets(mSheet).Cells(iCounts, 4) = "" Then
            For iCountc = 4 To 16
            If iReport.Worksheets(mSheet).Cells(iCounts, iCountc) = "" And iReport.Worksheets(mSheet).Cells(iCounts, iCountc).MergeCells = False Then
            book.Worksheets(mSheet).Cells(iCounts, iCountc).Copy
            iReport.Worksheets(mSheet).Cells(iCounts, iCountc).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            End If
            Next iCountc
        End If
        Next iCounts
Как ускорить выполнение этой части?
0
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
13.07.2018, 11:31
Giltis,
вместо строчек 5-7 попробуйте строчку из 1 го варианта...
Visual Basic
1
     iReport.Workbooks(mSheet).Cells(iCounts, iCountc).Value = book.Workbooks(mSheet).Cells(iCounts, iCountc).Value
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2018, 11:31
Помогаю со студенческими работами здесь

Ячейка должна принимать определенное значение в зависимости от значения другой ячейки и даты
Здравствуйте! Есть три таблицы "Спортсмены","Соревнования", "Дополнительно". Задача такая: Мне нужно чтобы при вводе данных в подчиненную...

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

Если ячейка Н больше ячейки Е, то умножить на Е
Добрый день Ребята как сделать если ячейка Н больше ячейки Е то умножить на Е, а если Е больше чем Н умножить на Е

Если в ячейках столбца есть значения, перенести некоторые ячейки из строки на другой лист
Доброго времени суток, профессионалы и увлекающиеся) Очень надеюсь, что есть среди Вас неравнодушные, кто даст мне дельный совет, как...

Перенос данных с одного листа одной книги на другой лист другой книги с константой
Добрый вечер, товарищи! Есть прайс-лист, который содержит в себе много колонок и строк. На ежедневной основе мне приходится распределять...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru