Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Некорректная работа цикла в цикле
 
Коллеги предположение оказалось верным, действительно ключ, который был необходим для копирования рассчитывался по формуле, а так как расчет формул в начале макроса был отключен для оптимизации, то он и не обновлялся при новой загрузке, что привело к ошибке. Всем спасибо! Ура! =)
Некорректная работа цикла в цикле
 
Прошу прощения, замечание обоснованно

Ошибка наиболее вероятна в коде "Application.Calculation = xlCalculationManual", при включении автоматического пересчета, все работает корректно.

Скорее всего ключ не обновляется формулой, думаю причина в этом =)
Изменено: AlekseyF - 06.04.2016 17:04:59
Некорректная работа цикла в цикле
 
Коллеги, ниже код с двумя циклами. Вопрос именно в том, почему при отладке, последовательно выполняется код правильно, но при запуске целиком, копирует без соблюдения логического условия проверки по ключу.
Код
    '##########################################
    '####  КОПИРОВАНИЕ ИЗ ВРЕМЕННОГО ЛИСТ  ####
    '##########################################

        Dim Sh_Goal As Worksheet, Sh_Goal_tmp As Worksheet

        SheetName_Goal = "Ввод данных"
        SheetName_Goal_tmp = "Ввод данных (2)"

        Set Sh_Goal = ActiveWorkbook.Worksheets(SheetName_Goal)
        Set Sh_Goal_tmp = ActiveWorkbook.Worksheets(SheetName_Goal_tmp)

        Dim i As Long
        Dim h As Long

        
        With Sh_Goal
        Count_Copy = .Cells(.Rows.Count, 3).End(xlUp).Row
        Count_Copy_tmp = Sh_Goal_tmp.Cells(.Rows.Count, 3).End(xlUp).Row
        
        For i = 3 To Count_Copy
        
            If .Cells(i, 4) = Sh_Goal_tmp.Cells(i, 4) Then
                .Cells(i, 5) = 1
                .Cells(i, 12).Resize(1, 83) = Sh_Goal_tmp.Range("L" & i).Resize(1, 83).Value
                .Cells(i, 93).Resize(1, 1) = Sh_Goal_tmp.Range("CO" & i).Resize(1, 1).Value
                .Cells(i, 96).Resize(1, 1) = Sh_Goal_tmp.Range("CR" & i).Resize(1, 1).Value
                .Cells(i, 98).Resize(1, 1) = Sh_Goal_tmp.Range("CT" & i).Resize(1, 1).Value
                .Cells(i, 101).Resize(1, 1) = Sh_Goal_tmp.Range("CW" & i).Resize(1, 1).Value
                .Cells(i, 103).Resize(1, 1) = Sh_Goal_tmp.Range("CY" & i).Resize(1, 1).Value
                .Cells(i, 106).Resize(1, 1) = Sh_Goal_tmp.Range("DB" & i).Resize(1, 1).Value
                .Cells(i, 108).Resize(1, 1) = Sh_Goal_tmp.Range("DD" & i).Resize(1, 1).Value
                .Cells(i, 111).Resize(1, 1) = Sh_Goal_tmp.Range("DG" & i).Resize(1, 1).Value
                .Cells(i, 113).Resize(1, 1) = Sh_Goal_tmp.Range("DI" & i).Resize(1, 1).Value
            Else
                Sh_Goal.Cells(i, 5) = 0
                For h = 3 To Count_Copy_tmp
            
                    If .Cells(i, 4) = Sh_Goal_tmp.Cells(h, 4) Then
                        .Cells(i, 5) = 1
                        .Cells(i, 12).Resize(1, 83) = Sh_Goal_tmp.Range("L" & h).Resize(1, 83).Value
                        .Cells(i, 93).Resize(1, 1) = Sh_Goal_tmp.Range("CO" & h).Resize(1, 1).Value
                        .Cells(i, 96).Resize(1, 1) = Sh_Goal_tmp.Range("CR" & h).Resize(1, 1).Value
                        .Cells(i, 98).Resize(1, 1) = Sh_Goal_tmp.Range("CT" & h).Resize(1, 1).Value
                        .Cells(i, 101).Resize(1, 1) = Sh_Goal_tmp.Range("CW" & h).Resize(1, 1).Value
                        .Cells(i, 103).Resize(1, 1) = Sh_Goal_tmp.Range("CY" & h).Resize(1, 1).Value
                        .Cells(i, 106).Resize(1, 1) = Sh_Goal_tmp.Range("DB" & h).Resize(1, 1).Value
                        .Cells(i, 108).Resize(1, 1) = Sh_Goal_tmp.Range("DD" & h).Resize(1, 1).Value
                        .Cells(i, 111).Resize(1, 1) = Sh_Goal_tmp.Range("DG" & h).Resize(1, 1).Value
                        .Cells(i, 113).Resize(1, 1) = Sh_Goal_tmp.Range("DI" & h).Resize(1, 1).Value
                        Exit For
                    End If
                Next

            End If
        Next
        End With
Некорректная работа цикла в цикле
 
Возможно что-то не замечаю, подскажите на что обратить внимание поподробнее?
Некорректная работа цикла в цикле
 
Прошу прощения, изначально прикрепил не тот файл. Сейчас ссылка в первом сообщении темы корректная!
Изменено: AlekseyF - 06.04.2016 13:10:40
Некорректная работа цикла в цикле
 
Добрый день форумчани!
Помогите пожалуйста разобраться с работой циклов. Бьюсь второй день(.

Суть вопроса: Есть 2 цикла, основной и вспомогательный, внутри основного. Основной пробегает по строкам исходной таблицы забирая составной ключ по которому должны копироваться данные из вспомогательной таблицы (она создается на основе основной на предыдущем "этапе").

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

Проблема: Когда устанавливаю чек поинт и делаю отладку по шагам, все отрабатывает корректно, но когда запускаю макрос (проблемная часть с 181 строки кода), копирование происходит без выполнения логических условий проверки ключа, тупо подряд строки из временной таблица в основную копируются.

В файле с примером целевой вид после выполнение макроса на листе "Ввод данных_Целевой", то, что получается сейчас при запуске на листе "Ввод данных_Ложный".
Помогите разобраться, почему так отрабатывает макрос при обычном запуске, в то время, как при отладке по шагам, все работает корректно?

Файл с примером https://yadi.sk/i/DWr0986fqn42b
Password - 123
Изменено: AlekseyF - 09.04.2016 21:57:25
Копирование диапазона, адрес которого задан с переменной, Копирование диапазона, адрес которого задан с переменной
 
Doober, спасибо громадное, вы меня очень выручали, работает на ура, открыл для себя resize! :) Успехов вам!
Копирование диапазона, адрес которого задан с переменной, Копирование диапазона, адрес которого задан с переменной
 
Коллеги, прошу помощи.

Необходимо скопировать циклом по строкам диапазон таблицы из "временного" листа в "постоянный" при выполнении конкретного условия. Диапазон по столбцам разрывают формулы, поэтому возможно придется делать несколько диапазонов на одну строку или может какой-то более удобный вариант, для примера взял первый диапазон с 6 по 8 столбец, в 9 идет первая формула, потом снова диапазон для копирования с 10 столбца по 15 например.

Условие, это совпадение на двух листах конкатенаций из 3 уникальных аналитик, т.е. если они совпали, то копируем указанный диапазон из одного листа в другой. Структура листов идентична по набору столбцов. Макрос при запуске ругается на функцию копирования.


Общий смысл примерно такой: Есть лист, куда прилетают много значений из ХД, эти значения идут в разрезе 3 уникальных полей (Структура_Должность_Сотрудник), далее эти данные копируются на пользовательский лист "Ввод данных", в котором заносят недостающие цифры.

Может возникнуть такая ситуация, когда обновились данные в ХД, например добавился новый сотрудник и встает вопрос как подкачать новые значения не потеряв старые (структура строк ломается), уже внесенные пользователем. Самый простой способ, который я придумал, это скопировать уже заполненные данные во временный лист, затем вставить обновленные данные из ХД и по ключу вернуть ранее заполненный цифры из временного листа обратно. На последнем этапе я пока и завис из-за того, что не знаю как грамотно скопировать диапазон между листами.(Опыт в VBA не большой)

Буду благодарен полезному совету, заранее спасибо!

Ссылка на файл с таблицей.https://yadi.sk/i/HkIM5PkqqjGb3
Код
   Sub Копирование()
    

    
    '##########################################
    '####  КОПИРОВАНИЕ ИЗ ВРЕМЕННОГО ЛИСТА ####
    '##########################################
    
    SheetName_Goal = "Ввод данных"
    SheetName_Goal_tmp = "Ввод данных (2)"
    
    Dim i As Integer
        
    Count_Copy = ActiveWorkbook.Sheets(SheetName_Goal).Cells(Rows.Count, 3).End(xlUp).Row

    
                    For i = 3 To Count_Copy
                        If ActiveWorkbook.Sheets(SheetName_Goal).Cells(i, 4) = ActiveWorkbook.Sheets(SheetName_Goal_tmp).Cells(i, 4) Then
                            ActiveWorkbook.Sheets(SheetName_Goal).Cells(i, 5) = 1

                             ActiveWorkbook.Sheets(SheetName_Goal_tmp).Range(Cells(i, 6), Cells(i, 8)).Copy
                             ActiveWorkbook.Sheets(SheetName_Goal).Range(Cells(i, 6), Cells(i, 8)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                :=False, Transpose:=False

                        Else
                            ActiveWorkbook.Sheets(SheetName_Goal).Cells(i, 5) = 0
                        End If
                    Next
                    

    End Sub
Совместный доступ: ошибка загрузки данных макросом из хранилища БД
 
Спасибо коллеги, всем удачи!
Совместный доступ: ошибка загрузки данных макросом из хранилища БД
 
Цитата
vikttur написал:
Где-то когда-то кто-то на форуме показывал этот список
Спасибо, полезная информация! По своему случаю сделал выборку из предоставленного файла, может кому в дальнейшем поможет:

(Н) – НевозможноЖ (В) – Варианты

1. (Н) Создание, запись, изменение, просмотр или назначение макросов.
(В) Можно запускать существующие макросы, не связанные с недоступными функциями.
Можно записывать действия общей книги в макрос, хранящийся в книге, к которой отсутствует общий доступ.
2.
(Н) Защита листов и книг и снятие защиты
(В) Существующая защита остается в силе.

Правда не понял момент связанный с "Можно записывать действия общей книги в макрос, хранящийся в книге, к которой отсутствует общий доступ.". Может можно как-то использовать это в моем случае, что значит макрос в книге, к которой отсутствует общий доступ?  
Изменено: AlekseyF - 29.01.2016 12:45:47
Совместный доступ: ошибка загрузки данных макросом из хранилища БД
 
Цитата
А чем помогать-то? У Вас идет попытка вставки данных на защищенный лист. Либо изменяйте параметры защиты ячеек так, чтобы код мог в них данные вставить, либо отключайте защиту вовсе. В общем доступе менять параметры защиты нельзя - только до установки общего доступа.
Как можно поменять параметры защиты ячеек, чтобы и код данные в них вставил и пользователь потом эту информацию поменять не смог, так как она является ключевой для сводной таблицы в которую потом вносятся данные? Отключить защиту вовсе никак нельзя, очень велика вероятность того, что кто-нить исходные данные поправит, пусть даже случайно..много пользователей работает с файлом.
Совместный доступ: ошибка загрузки данных макросом из хранилища БД
 
 
Суть проблемы:

На локальном сервере есть файл Excel с возможностью совместного пользования. Одна часть листов файла заполняется пользователями, другая только макросом из хранилища БД. При этом те данные которые заполняются из хранилища являются справочной информацией и пользователь не должен иметь возможность править\ изменять эти листы. Соответственно когда запускается макрос для загрузки данных из ХД появляется ошибка, макрос не может записать информацию в ячейки, которые закрыта для редактирования пользователями в режиме совместного использования.

Задача: Загрузить необходимые данные из хранилища таким образом, чтобы пользователи имели возможность просмотра этой информации без редактирования, при этом важное условие, чтобы книга была в совместном доступе, так как есть листы, в которые рулями тянется информация с листов заполненных макрасом и пользователи вносят в эти листы данные. Чтобы было понятнее, приведу пример: макрасом из ХД формируются справочники (Сотрудник,Подразделение,Должность) на отдельных листах, потом информация правилами внутри книги подтягивается в итоговую сводную таблицу, в которой пользователи вносят данные в режиме совместного доступа. Возможно такое реализовать без сильных потерь в функционале?
Изменено: AlekseyF - 29.01.2016 11:51:37
Совместный доступ с возможностью одновременного редактирования.
 
Коллеги, прошу помощи! Увидел похожую тему, решил написать сюда, если нужно открывать новую тему, прошу прощения.

Суть проблемы: На локальном сервере есть файл Excel с возможностью совместного пользования.Часть листов файла заполняется пользователями, часть макросом из хранилища БД. При этом те данные которые подтягиваются из хранилища являются необходимой справочной информацией и пользователь не должен иметь возможность править эти листы. Соответственно когда запускается макрос для загрузки данных из ХД появляется ошибка, так как на листах стоит защита от пользователя. Прошу опытные головы, откликнитесь))!
Изменено: AlekseyF - 28.01.2016 20:21:08
Страницы: 1
Наверх