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

Страницы: 1
Отключение двойного пересчета формул по условию
 
Здравствуйте. Есть макрос, который при изменении текста в ячейке A1 (тут выпадающий список из 2 значений) например на "English", в ячейке C1 проставляет 120. Но проблема в том, что Excel дважды пересчитывает формулы: 1 раз - после изменения в ячейке A1, 2-ой раз - после того как макрос проставил в ячейку C1 значение 120. На листе и в книге вцелом много формул, которые подвязаны на эти ячейки, соответственно файл достаточно тормозит при пересчете, а тут так 2 раза. Подскажите, пожалуйста, можно ли решить проблему с пересчетом. Отключать пересчет при открытии файла нельзя, так как не всегда пользователь должен выбирать что то в ячейке А1, а может делать другие действия и формулы также должны пересчитаться. Заранее спасибо


Код
  Option Compare Text

Private Sub Worksheet_Change(ByVal Target As Range)


  If Not Intersect(Target, Range("A1")) Is Nothing Then
    
 
      If InStr(1, Range("A1"), "English") > 0 Then
        Range("C1").Value = "120"
      End If
      
      If InStr(1, Range("A1"), "German") > 0 Then
        Range("C1").Value = "90"
      End If
  
  End If

End Sub
Проблемма с переменной, не находит такое же значение в названии вкладки
 
Помоготе пожалуйста, заблудился в 3 соснах.
С основного файла нахожу другой файл с вкладками, там 20 вкладок, вкладка называется фамилией клиента. Не повторяется. Макросом вытягиваю список листов, и прохожусь по этому списку до конца. В коде задаю переменную для названия листа (название клиента). В окне Locals переменная задается, но не находит листа с таким же названием чтоб скопировать. Хотя список макросом формируется из этих же листов. Ниже код, чтоб было понятнее. Пример названия первого клиента - 987 ПАТ "МЕХАТРОНИК"

Где я делаю не так? В окне Locals - переменная принимает значение 987 ПАТ "МЕХАТРОНИК", но найти вкладку в другом файле с таким названием не могу.

Код
Sub copycliensdata()

On Error Resume Next
Dim Data1folder, Data2folder
Dim oFD As FileDialog
Dim Myfile_Name, NewFile_Name As Variant
Dim mySh As Worksheet, ws As Worksheet
Dim Wbk As Workbook
Dim i As Long
Dim x&, Numrows&
Dim client$


        Data1folder = Application.GetOpenFilename _
                ("Excel files(*.xls*),*.xls*", 1, "Выбрать файл", , False)   'здесь выбираю файл где есть 20 вкладок, каждая вкладка с названием клиента
        If VarType(Data1folder) = vbBoolean Then
            Exit Sub
        End If



        With Workbooks.Open(Data1folder)                                               'формирую список клиентов
            For i = 1 To .Sheets.Count
                ThisWorkbook.Sheets("Macros").Cells(i, 10).Value = .Sheets(i).Name 'список клиентов
            Next
        End With

        Windows("Основной_файл.xlsb").Activate
        Numrows = Workbooks("Основной_файл.xlsb").Sheets("Macros").Range("J1", Range("J1").End(xlDown)).Rows.Count ' диапазон клиентов
            For x = 1 To Numrows
            With Worksheets("Macros")
                client = .Cells(x, 10).Value 'первый клиент из списка, 1-ый клиент с названием 987 ПАТ "МЕХАТРОНИК"
            End With

        Workbooks(Data1folder).Worksheets(client).Range("A1:B200").Copy   ' Здесь не находит клиента с названием 987 ПАТ "МЕХАТРОНИК" которое в переменной client
                                                                           А сам список формируется из названий тех же листов!!!!!
        Windows("Основной_файл.xlsb").Activate

       Sheets("Calculation").Select
        Cells.Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
        ActiveSheet.Paste
        Application.CutCopyMode = False


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

Книга 1(расчетный файл, здесь макрос), Лист4 в диапазоне А1:A21 название клиентов. Нужно взять название клиента из A1,зайти в заданную папку (нужно задать один раз для всего цикла) где лежит Книга2 у которой есть 20 вкладок, нужно найти вкладку с названием из ячейки А1. Скопировать данные с этой вкладки в Книгу1, Лист1. Второй шаг. Найти опять клиента по названию с ячейки А1 в заданной папке файл (задать путь 1 раз для всего цикла), открыть файл, скопировать вкладку (она там одна) и вставить данные в Книгу1 Лист2. Третий шаг. Перейти в расчетном файле (куда скопировали 2 вкладки) на Лист 3, пересчитать все формулы. Сохранить эту одну вкладку в заданной папке (также задать путь для всего цикла) с названием с ячейки А1, и переименовать вкладку на название с А1, обрезать связи, сохранить и перейти к 2 клиенту в ячейке А2 и так по всем клиентам. У нас есть 1 расчетный файл, путь 1 где лежит 1 файл у которого есть 20 вкладок (по одной вкладке на клиента), путь 2, где лежат 20 файлов с названиями клиентов (в каждом файле только 1 вкладка), путь 3 где нужно сохранить результат, только 1 вкладку с названием из ячейки. В конце в папке по пути 3 должно быть 20 файлов.

Внизу примерный макрос, Если можно его дописать, если это и вовсе не годится тогда наверное заново все.

Код
On Error Resume Next
Dim sFolder As String, sFiles As String
Dim MSdatafile


Data1Folder$ = GetFolder(1, , "Виберите папку с файлом")          ' путь 1 папка гдележит 1 файл у которого 20 вкладок
If InvoiceFolder$ = "" Then MsgBox "Не выбрано", vbCritical, "Завершено": Exit Sub

Data2Folder$ = GetFolder(1, , "Виберите папку с файлами")          ' путь 2
If InvoiceFolder$ = "" Then MsgBox "Не выбрано", vbCritical, "Завершено": Exit Sub

Data3Folder$ = GetFolder(2, , "Виберите папку куда сохранять файлы") ' путь 3
    If ArchieveFolder$ = "" Then MsgBox "Папка не задана", vbCritical, "Завершено": Exit Sub
Set sht = book.Sheets(

Numrows = Range("E2", Range("E2").End(xlDown)).Rows.Count ' диапазон названия клиентов
 
For x = 1 To Numrows
With sht
   
    arr = .Range(.Cells(2, 1), Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count))
End With


'-----------------------ШАГ ОДИН-----------------------
'Data1Folder$ тут лежит 1 файл где есть 20 вкладок, найти владку с названием из ячейки A1
Workbooks("Книга2.xlsx").Worksheets("Клиент1").Range("A1:T200").Copy  ' тут нужно сделать цикл а не жестко привязать название клиента
Windows("Книга1.xlsm").Activate                                 ' книга в которую копируем, расчетный файл
Sheets("Лист1").Select                                          ' вкладка куда копируем данные
Cells.Select                                                          ' диапазон куда копируем
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False                                     ' вставляем только значения
    ActiveSheet.Paste
Application.CutCopyMode = False                                       ' отменить выделенный диапазон


'-----------------------ШАГ ДВА-----------------------

    
' выбрать папку Data2Folder$ тут лежит 20 файлов из названиями. Нужно найти файл с названием из ячейки А1

Set wb = Application.Workbooks.Open(sFolder & sFiles)                 'здесь скорее всего неправильно
wb.Sheets(1).Range("A1:T200").Copy
Workbooks("Книга1.xlsm").Worksheets("Лист2").Range("A1").PasteSpecial Paste:=xlPasteValues ' куда копируем
Application.CutCopyMode = False                                       ' отменить выделенный диапазон
wb.Close True                                                         'закрыть файл откуда скопировали данные
        sFiles = Dir


'-----------------------ШАГ ТРИ-------------------------------
Windows("Книга1.xlsm").Activate                                 ' 
Sheets("Лист3").Select
Application.Calculate                 ' пересчитываем все формулы в Книге1
Data3Folder$ 'сюда сохраняем Лист3, с названием из ячейки А1, переименовываем Лист1 также на название с ячейки А1, обрываем связи
Workbooks("Книга1.xlsm").Worksheets("Лист3").SaveCopyAs Path & Имя_для_сохранения & ".xlsx" ' сохраняем 

Конец цикла, переходим к ячейке А2, делаем все то же, до конца списка клиентов.

End Sub
Копирование данных с таблицы по условию с другой таблицы
 
Здравствуйте, пытаюсь написать макрос для копирования по условию, вроде все просто но не совсем. Есть большая база данных с клиентами и их email, столбец 1-email, 2- фамилия, 3-образование, 4-опыт работы, итого 8 столбцов. Email повторяются, если у человека 3 предыдущих работы, то будет 3 строки, с одинаковым email в 1 столбце. Есть список email от руководства, выбрать клиентов по этому списку, с всеми строками с одинаковым email. То есть, если из списка руководства email совпадает с базой клиентов, то скопировать все строки с одинаковім email на другой лист. База данных 60 тыс строк, список от руководства - 400 email. Итог может получится 900 строк (400 адресов, у каждого по 2-3 образования или 2-3 предыдущих работы). В приложении образец. Data - большой список данных на 60 тыс строк, Запрос - список адресов от руководства, Result - пример, что должно из этого получится. Спасибо
Выбор диапазона ячеек по двум условиям
 
Здравствуйте, нужно выбрать диапазон, границы которого будут определятся с помощью значения ячеек на листе Позиции ячеек могут быть разными но в диапазоне А1:Н100. Например Этап 1.Ищем позицию слова "начало" - это левая верхняя граница диапазона Этап 2. Ищем слово "Итого" - нижняя правая граница диапазона. Этап 3 скопировать этот диапазон на другой лист - "Сводная"

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

Внизу примерный макрос
Код
Sub Diapazon()

       For Each s In Range("A1:H100").Cells
       If s = "начало" Then
       'ActiveSheet.Cells(s.Row, s.Column).Select
       End If
   Next s
   
       For Each t In Range("A1:H100").Cells
       If s = "Итого" Then
       'ActiveSheet.Cells(s.Row, s.Column).Select
        End If
   Next t
   
      ActiveSheet.Range(Cells(t.Row, t.Column), Cells(s.Row, s.Column)).Copy

End Sub
Извлечение файлов и папок с указанных архивов с помощью VBA
 
Здравствуйте, с помощью указанного ниже кода, макрос ищет по указанному пути архивный файл и извлекает 3 определенных файла по маске в папку где находится этот архив. Но проблемма в том, что иногда в указанных архивах может быть еще один подархив или папка где имеются искомые файлы. Возможно ли подправить код, чтоб если не найдены файлы в архиве то открыл подархив (в этом же архиве если он имеется) или если нет то папку в этом архиве (если имеется)?
Код
Option Explicit
 
Sub Archives()
 
    On Error Resume Next
    Dim s7zipPath$, sArcPath$, sArcFile$, sDestPath$, sDelim$, CmdLine$
    Dim strDirPath$, strFileName$
    Dim strMaskSearch$
    Dim arr$(1), iPath$
    Dim x&, Numrows&, book As Workbook
    
    Application.ScreenUpdating = False 
    
    s7zipPath = "C:\Program Files\7-Zip\7z.exe" ' путь к архиватору 7zip
    
    Windows("Поиск файлов.xlsm").Activate
    Sheets("Limits").Select
    Numrows = Range("EE" & Rows.Count).End(xlUp).Row                              'диапазон ячеек с адресами 
    iPath = "D:\Companies\Statements\"                                            'корнева папка
     
    For x = 2 To Numrows
       
        Windows("Поиск файлов.xlsm").Activate
        Sheets("Limits").Select
        With Worksheets("Limits")
            arr(0) = .Cells(x, 135).Value                                               'адрес где искать архив, 1-ая часть адреса
            arr(1) = .Cells(x, 136).Value                                               'адрес где искать архив, 2-ая часть адреса
        End With
        strDirPath = iPath & arr(0) & "\" & arr(1) & "\"
        strMaskSearch = "*.zip*" And strMaskSearch = "*.rar*" And strMaskSearch = "*.7z*"   'возможные варианты архивов по указанному адресу
     
        sArcPath = strDirPath & strMaskSearch                                   ' путь к архиву
        sArcFile = "*#090*"                                                      ' имя 1 файла в архиве, который нужно распаковать (1)
        sArcaFile = "*#061*"                                                     ' имя 2 файла в архиве вариант 1, который нужно распаковать (2.1)
        sArccFile = "*#01S*"                                                     ' имя 2 файла в архиве вариант 2, который нужно распаковать (2.2)
        sArcbFile = "*#310*"                                                     ' имя 3 файла в архиве, который нужно распаковать (3)
        sDestPath = strDirPath                                                  ' путь к папке, куда распаковать файлы (полный или относительный)
    
        CmdLine = """" & s7zipPath & """" & " x " & """" & sArcPath & """" & " " & """" & sArcFile & """" & " -o" & """" & sDestPath & """" & " -y"  ' роспаковка(1)
        Shell CmdLine
        
        CmdLine = """" & s7zipPath & """" & " x " & """" & sArcPath & """" & " " & """" & sArcaFile & """" & " -o" & """" & sDestPath & """" & " -y" ' роспаковка(2.1)
        Shell CmdLine
    
        CmdLine = """" & s7zipPath & """" & " x " & """" & sArcPath & """" & " " & """" & sArccFile & """" & " -o" & """" & sDestPath & """" & " -y" ' роспаковка(2.2)
        Shell CmdLine
               
        CmdLine = """" & s7zipPath & """" & " x " & """" & sArcPath & """" & " " & """" & sArcbFile & """" & " -o" & """" & sDestPath & """" & " -y" 'роспаковка(3)
        Shell CmdLine
        
        'CreateObject("WScript.Shell").Run CmdLine, 1, True ' синхронный запуск
    
    Next

End Sub
Сохранения диапазонов книги по пути из списка папок и файлов
 
Доброго времени суток. Прошу вашей помощи. Имеется список в диапазоне ячеек A2:A31 - название папок и B2:31 - названия файлов С2:С31 - даты . Диапазон может быть длиннее или короче на 30 ячеек либо 35 и т.д. Я написал макрос который сохраняет 3 листа с рабочей книги Excel в папку с названием ячейки A2 и B2 с названием файла в ячейке B2 и С2. Помогите организовать цыкл, чтоб макрос автоматически сохранил файлы по списку, то есть первый раз макрос сохранил файл в папку A2, B2 с названием В2, С2, выполнил Макрос 2 + скопировал диапазон K5:Q15 в другой лист, потом автоматически перешел в 2 ячейку и сохранил файл в папку с названием A3 B3 и названием файла B2 С2, опять выполнил Макрос 2 + скопировал диапазон в другой лист и так до конца списка. Папки предварительно созданы. В приложении файл. Спасибо
Код
Sub savefile()
    On Error Resume Next
    Dim a$, d$
    
    
    Call Макрос2
    
    Worksheets Данные.Select
    Range(K5, Q15).Select
    Selection.Copy
    Worksheets Письма.Select
    Range(A1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Name = "Данные"
    a = Worksheets(Name).Cells(2, 1).Value 'адрес папки куда сохранять
    d = Worksheets(Name).Cells(2, 2).Value 'название файла - 1-ая часть
    k = Worksheets(Name).Cells(2, 3).Value 'название файла - 2-ая часть (дата)
    Application.ScreenUpdating = False
    
    Err.Clear: Worksheets(Array("Данные", "Листок2", "Листок3")).Copy: DoEvents ' копируем листы (создание новой книги)
    If ActiveWorkbook.Worksheets.Count = 3 And ActiveWorkbook.Path = "" Then
    
    ActiveWorkbook.SaveCopyAs Filename:="С:\Мои документы\" & a & "\" & d & "\" & d & "_" & k & ".xlsx" ' сохраняем файл с заданым именем
    
    If VarType(FName) <> vbBoolean Then ActiveWorkbook.SaveAs FName
    
    ActiveWorkbook.Close False ' закриваєм файл
    
    Application.ScreenUpdating = True
    
    End If
End Sub
Страницы: 1
Наверх