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

Страницы: 1
Vba аналог range = range.value, но с автофильтром
 
БМВ, Спасибо за участие)

Правда в итоге решила другим способом. Более заморочистым, но работает как мне надо.
Vba аналог range = range.value, но с автофильтром
 
Цитата
А смысл в таких манипуляциях?
Я обладаю весьма ограниченными познаниями vba и так было писать проще. И заодно был выбор, переносить в итоговую колонку или нет. Но это необязательно.
Цитата
опишите ЗАДАЧУ
Задача в том, чтобы пользователь мог в приложенном файле выставить нужные фильтры в некоторых колонках (A, C, L), а потом запустить макрос с формулой и получить конечный расчет в виде значений в колонке AD ("Корректировочный заказ").

И кстати, в идеале бы еще было, чтобы в случае если расчет в колонке AD был равен 0, то вместо нуля оставалась бы просто пустая ячейка.
Код
=ЕСЛИ(ИЛИ(И(P1=0;T1=0;U1=0);И(ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1)<5;ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1)>0;T1>2;P1<U1*2));ОКРУГЛ(ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1);-1)+10;ОКРУГЛ(ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1);-1))
Изменено: eonka - 12.03.2024 06:02:21
Vba аналог range = range.value, но с автофильтром
 
Добрый день,

В макросе содержится формула. Нужно чтобы из колонки с формулой AF переносились значения в итоговую колонку AD.
Без автофильтров работает. Но важно чтобы работало с автофильтрами в предыдущих колонках, с ними перестает работать.
Как сделать чтобы работало с автофильтрами?
Код
Sub test()
    Dim LastRow As Long
    Dim mySheet As Worksheet

    Set mySheet = ActiveSheet
    Application.ScreenUpdating = False
    With mySheet
          LastRow = .Cells(.Rows.Count, 4).End(xlUp).Row
         With .Range("AF1:AF" & LastRow)
            .HorizontalAlignment = xlCenter
            .NumberFormat = "General"
            .FormulaLocal = "=ЕСЛИ(ИЛИ(И(P1=0;T1=0;U1=0);И(ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1)<5;ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1)>0;T1>2;P1<U1*2));ОКРУГЛ(ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1);-1)+10;ОКРУГЛ(ЕСЛИ(P1>=ЕСЛИ(T1<50;U1+10;U1/14*21);0;ЕСЛИ(T1<50;U1+10;U1/14*21)-P1);-1))"
            .Calculate
            .NumberFormat = "@"
            '.Value = .Value
        End With
         Range("AF1:AF2").ClearContents
         mySheet.Range("AD2").Copy mySheet.Range("AF2")
    End With
    
    Application.ScreenUpdating = True
    
    If MsgBox("Перенести значения в колонку заказ?", vbQuestion + vbYesNo, "Перенос") = vbNo Then Exit Sub

    Range("AD:AD") = Range("AF:AF").Value
 
    
End Sub
Изменено: eonka - 12.03.2024 05:40:12
VBA Макрос чтобы переносить значения из одной книги в другую
 
Sanja, Спасибо огромное. Помогло!
VBA Макрос чтобы переносить значения из одной книги в другую
 
Ігор Гончаренко, Объясню зачем мне макрос для этой задачи. Он будет применяться не к пустому файлу, а большому отчету, к которому нужно применить сложное условное форматирование. А данные для условного форматирования в другой книге и ссылки в формулы в условном форматировании вставлять нельзя. Поэтому я начала макрос с того, чтобы сначала данные переносились.
VBA Макрос чтобы переносить значения из одной книги в другую
 
Добрый день,

На основании существующих у меня работающих макросов создаю новый. Для дальнейшего воплощения задуманного нужно чтобы этот код переносил из открываемого файла, допустим, в чистую книгу значения из колонки B. То есть я в чистой книге запускаю макрос, выбираю файл-источник kvi (прикрепляю пример) и из него данные столбца B должны скопироваться в чистую книгу.
Не могу найти свою ошибку в коде. Почему-то переносит только нижнюю ячейку, а нужно чтобы все значения из столбца B. Помогите, пожалуйста.
Код
Sub Престиж()

    Dim mySheet As Worksheet
    Dim myBook As Workbook
    Dim OpenFile As Variant
    Dim wbSource As Workbook
    Dim wsSourceSheetName As String
    Dim LastRow
    Dim A As Range
   
    
    Set myBook = ActiveWorkbook
    OpenFile = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", 1, "Выберите файл с престижными позициями", , False)
                    If VarType(OpenFile) = vbBoolean Then 'преждевременная остановка макроса
                Exit Sub
                    End If
    Application.ScreenUpdating = False
    
    Set wbSource = Workbooks.Open(OpenFile, UpdateLinks:=False, ReadOnly:=True)
    wsSourceSheetName = wbSource.ActiveSheet.Name
    sFilename = Mid$(OpenFile, InStrRev(OpenFile, Application.PathSeparator, -1, vbBinaryCompare) + 1)
    
 
         For Each A In wbSource.Worksheets(1).[A1].CurrentRegion.Columns(1).Cells
        i = 1
        A = A.Resize(1, 2)
            If A.Row >= 2 Then
        With myBook
                    With .Worksheets(1)
                        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                            .Cells(LastRow, 4) = A(i, 2)
                    End With

        End With
            End If
        Next

    

End Sub
VBA Как сделать чтобы макрос активировал на каждом листе определенную ячейку
 
Sanja, Не пустую, а с тремя тестовыми листами). Пардон, ранее когда просила помощи то всегда отдельно вставляла код и отдельно файл-пример, ничего другого еще никто не просил). Тут просто код и задача совсем простенькие, поэтому как-то так глупо получилось.

evgeniygeo, Aнaстaсия, Спасибо огромное! Sh.Activate и все заработало как мне нужно.
VBA Как сделать чтобы макрос активировал на каждом листе определенную ячейку
 
Добрый день,

Есть документ с огромным количеством листов.
Нужно чтобы при запуске макроса на каждом листе вносились данные (это получилось) и при этом чтобы активировалась (т.е. то что происходит когда мы курсором нажимаем на ячейку) одна и та же ячейка на каждом листе.
Код ниже. В нем через Cells или Range получается выделить ячейку только на первом листе. А если делать Sh.Cells или Sh.Range по типу заполняемых данными ячеек, то возникает ошибка.
Код
Sub Листы()
Dim Sh
For Each Sh In ActiveWorkbook.Worksheets
        Sh.Cells(1, 2) = "123"
        Sh.Cells(1, 4) = "321"
        Cells (4, 1).Select
        Next Sh

End Sub
Изменено: eonka - 25.09.2023 05:45:03
Макрос для ВПР из таблицы в таблицу с динамическим количеством строк
 
Теперь понятно, хорошо объясняете. Спасибо!
Макрос для ВПР из таблицы в таблицу с динамическим количеством строк
 
Да, спасибо огромное, это решило все проблемы. Сейчас все работает прекрасно.

Только хотелось бы разобраться, что делает эта строка ".Value = .Value". В какой рендж подтягивает понятно, а вот где источник непонятно. Почему без этой строки у меня все работает и с фильтрами и без? И каково ее назначение в коде, раз она там появлялась.
Пыталась нагуглить, почитала об этом свойстве. Но прямых ответов не нашла. Хочется разобраться. Буду благодарна за объяснение.
Макрос для ВПР из таблицы в таблицу с динамическим количеством строк
 
Не уверена, но кажется нашла проблему. Попробуйте в своем макросе скрыть первый магазин. По-моему проблема возникает в том случае, когда формула в скрытых строчках. Можно с этим что-нибудь сделать?
Макрос для ВПР из таблицы в таблицу с динамическим количеством строк
 
Хм, видимо, где-то намудрила когда подтягивала ваш код в свой основной. Спасибо, поковыряюсь.
Макрос для ВПР из таблицы в таблицу с динамическим количеством строк
 
Спасибо огромное! Работать макрос стал действительно шустрее. Завтра в начале рабочего дня проведу ему полный тестдрайв).

Только он теперь перестает работать, если использовать любые фильтры по колонкам. Можно ли как-то подправить макрос парой строк так, чтобы при фильтрации (например, в первой колонке "Магазины" файла "Заказ" выбрать числа 1 и 2) можно было запускать этот макрос и он тоже работал?
Или в данном случае уже полностью перекраивать код надо?
Макрос для ВПР из таблицы в таблицу с динамическим количеством строк
 
Добрый день,
Помогите допилить макрос, пожалуйста. Суть такая.
Есть таблица "Заказ", прикрепляю упрощенный пример. В реальности в ней большое и динамическое количество строк и оно растет.
Нужно чтобы макрос с помощью ВПР прикреплял в крайний столбец данные из таблицы "Кратности".
Мой макрос работает, но т.к. в первой таблице динамическое количество строк, то приходится корретировать рендж в третью строку снизу, чтобы макрос срабатывал на ограниченное количество строк, а не на весь лист, включая незаполненные строки. При этом даже с этим ограничением макрос подвисает.
Можно ли как-то оптимизировать эту задачу? Как задать конечную строку в динамической таблице, чтобы впр срабатывал до последней заполненной строки?

Дополнительный вопрос. Можно ли в строчку с формулой ВПР в название файла вписать как-то переменную, чтобы туда каждый раз подставлялось имя открываемого файла и при этом он не был всегда назван "Кратности1"?

Заранее благодарю.
Код
Sub Кратности1()
Dim LastRow&, OpenFile
OpenFile = Application.GetOpenFilename _
                ("Excel files(*.xls*),*.xls*", 1, "Выберите файл с кратностями", , False)
                    If VarType(OpenFile) = vbBoolean Then 'преждевременная остановка макроса
                Exit Sub
                    End If
Application.ScreenUpdating = False
    Cells(2, 4) = "Кратности"
     Range("D2").VerticalAlignment = xlCenter
     Range("D2").Font.Bold = True
    Columns("D:D").Select
    With Selection.Interior
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.599993896298105
        .PatternTintAndShade = 0
    End With
Cells(3, 4).FormulaLocal = "=ВПР(B3;[Кратности1.xlsx]Лист2!$A$2:$B$1000;2;0)"
LastRow = Cells(Rows.Count, 4).End(xlUp).Row + 1
Range("D200900:D" & LastRow).FormulaR1C1 = Range("D3").FormulaR1C1
Application.ScreenUpdating = True
End Sub
При переносе данных оставить верхнюю строку пустой
 
_Boroda_, Ухты, теперь поняла как с этим куском обращаться) Спасибо!

Ігор Гончаренко, Ахах) ну в общем...
Однажды захотелось сделать макрос, на который возможностей макросрекордера не хватало. Погуглила, нашла нечто, примерно делающее, что мне надо и это нечто стало базой моего будущего макроса. На нем же училась и постепенно получила начальные самые поверхностные знания, позволяющие читать код (вот сейчас, наверное, последняя строчка той базы перестала быть таинственной)). После того, как первый настоящий (не рекордовый) макрос оброс всеми необходимыми функциями и заработал, решила переписать старые макросы, сделанные рекордером. Чтоб работало без кучи костылей). Пригодился кусок из первого макроса - благо переменные не корабли, как не назови - все равно работают! За что спасибо им)).
При переносе данных оставить верхнюю строку пустой
 
Аааа, я поняла. Она без этой строки начинает со второй потому что .row+1. Правильно? А если я захочу с третьей начать? Чего-то если я row +2 делаю, то он через одну пустую вставляет строки.
Помогите допонять).

И спасибо огромное, с нужной задачей уже справилась.  
При переносе данных оставить верхнюю строку пустой
 
Добрый день,
Не  могу понять, как заставить макрос вставлять данные в новой книге не в А1 ячейку, а в А2. Чтобы строка 1 оставалась полностью пустой. Подскажите, пожалуйста.
Если делаю Then Last Row = 2, то макрос поочередно перезаписывает все строки таблицы в строку 2. А если Last row = 1, то все ок, но мне нужно чтобы самая верхняя строка оставалась пустой.
Код
    Dim A, B, i%, Sample, LastRow&, DeskTopPath$
    Dim Cl As Range
    Set B = ActiveWorkbook
    Workbooks.Add
    Set Sample = Workbooks(Workbooks.Count)
    For Each Cl In B.Worksheets(1).[A11].CurrentRegion.Columns(1).Cells
        i = 1
        A = Cl.Resize(1, 31)
            If Cl.Row >= 12 Then
                If Not Cl.EntireRow.Hidden Then
        With Sample
            With .Worksheets("Лист1")
                        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                        If IsEmpty(.[A1]) Then LastRow = 1
                            .Cells(LastRow, 1) = A(i, 3)
                            .Cells(LastRow, 2) = A(i, 5)
                            .Cells(LastRow, 3) = A(i, 31)
            End With
        End With
                End If
            End If
    Next

End Sub
Изменено: eonka - 02.12.2022 10:00:24
Vba Перенос только видимых строк и столбцов
 
Спасибо огромное. Вот теперь разобралась. И с колонками скрытыми что делать тоже дошло.

А Local, я так понимаю, там не нужен)
Я видела, что resume в примерах везде без него, но убирать не рискнула т.к. он не мешал.
Изменено: eonka - 21.11.2022 16:07:28
Vba Перенос только видимых строк и столбцов
 
Так и не смогла прикрутить эту конструкцию к коду: выходило, что либо копирует только все скрытые строки, то копирует и видимые и скрытые. В итоге сделала свой макрос через костыль с копированием диапазона  без скрытых ячеек в другую книгу.
Но все-таки, ради общего развития, как правильно было вставить эту конструкцию в код?

И еще, чтобы новую тему не создавать: почему если я меняю Workbooks("start.xlsx") на thisworkbook, то почему возникает type mismatch? Разве, по сути, происходит не то же самое, только в первом случае я указываю имя файла, а во втором книгу, из которой запускается макрос?
Квадратные скобки в коде - что это такое?
 
Огромное спасибо всем за ответы!
Теперь поняла.
Квадратные скобки в коде - что это такое?
 
Добрый день,
Скопировала я чужой код со строкой.
Код
A = Workbooks("start.xlsx").Worksheets(1).[A1].CurrentRegion

И очень смущает меня это [А1]. Честно гуглила, но, видимо, запрос  я как-то неверно составляю, потому что ответ найти так и не удапось. Зато нашлось наставление никогда не использовать квадратные скобки в коде). Правда, без этого [А1] макрос почему-то ломается и не работает.
Разжуйте, пожалуйста, что же это такое.
Vba Перенос только видимых строк и столбцов
 
Добрый день,
Подскажите, в какое место правильно вставить SpecialCells(xlCellTypeVisible) чтобы макрос обрабатывал только видимые строки, игнорируя скрытые.
Вот маленький кусочек кода и источник и принимающий данные файлы. В исходнике скрыла столбцы.

Код
Sub Test()
    Dim A, Sh, i%, LastRow&
    A = Workbooks("start.xlsx").Worksheets(1).[A1].CurrentRegion
    For Each Sh In Workbooks("finish.xlsx").Worksheets
    Next Sh
    For i = 3 To UBound(A)
        A(i, 1) = Format$(0, A(i, 1))
        With Workbooks("finish.xlsx")
                If Not SheetExists(A(i, 1), Workbooks("finish.xlsx")) Then
                    With .Worksheets.Add(After:=.Worksheets(.Worksheets.Count)): .Name = A(i, 1):
                    End With
                End If
                With .Worksheets(A(i, 1))
                LastRow = .Cells(.Rows.Count, 1).SpecialCells(xlCellTypeVisible).End(xlUp).Row + 1                
                If IsEmpty(.[A1]) Then LastRow = 1
                        .Cells(LastRow, 1) = A(i, 2)
                        .Cells(LastRow, 2) = A(i, 3)
                        .Cells(LastRow, 3) = A(i, 4)
            End With
        End With
    Next i
  
End Sub
Function SheetExists(SheetName, Optional wb As Workbook) As Boolean
    If wb Is Nothing Then Set wb = ActiveWorkbook
    On Local Error Resume Next: SheetExists = wb.Worksheets(SheetName).Name = SheetName: Err.Clear
End Function

Изменено: eonka - 20.11.2022 08:38:24
Сохранение файла под прежним именем в другом месте в макросе
 
Огромное вам спасибо!
И прям  отдельное огромное-огромное за комментарии. Учусь читать код и вот еще не попробовала применить, но уже узнала новое полезное. И теперь планирую это применить и в некоторых других местах своего макроса
Сохранение файла под прежним именем в другом месте в макросе
 
Добрый день,
Подскажите, есть ли возможность сохранения файла, выбранного с помощью Application.GetOpenFilename под тем же именем, но в другом месте? Можно это как то прописать в .SaveAs ?
У меня есть общая таблица, которую с помощью макроса я раскидываю по готовым шаблонам с определенными именами. Шаблоны лежат в папках и макрос GetOpenFilename позволяет выбирать нужные.
Я бы хотела чтобы макрос после заполнения шаблона сохранял его, допустим, на рабочий стол, но под тем же именем, под которым этот шаблон был изначально.
Макрос для переноса данных из одной таблицы в другую книгу
 
Так и не смогла разобраться с этим более усложненным кодом. В итоге взяла свой простой, избавилась в нем от thisworkbooks и, о чудо, заработало!))
Все равно для файла-исходника есть простой макрос чтобы собирал данные в читаемый вид. Сделаю чтобы он еще и сохранял под определенным именем, да и фиг с ним. Зато работает T_T
Макрос для переноса данных из одной таблицы в другую книгу
 
Ух, усложнили, спасибо.
Но почему теперь ругается что With .Worksheets(A(i, 1)) не в рендже?
Массивы как-то сложны для понимания новичка.
Макрос для переноса данных из одной таблицы в другую книгу
 
Добрый день,
Я не очень в vba, но потребовалось и собрала макрос для работы. Он даже работал (я его еще допиливаю до полного удобства) пока не добавила возможность выбирать файл вместо работы с забитым в макрос именем файла по умолчанию. Теперь какой-то mismatch.
Гуглила. Понимаю, что дело в типе данных, но не понимаю, что именно надо поправить.
Смысл в том, чтобы при запуске макроса данные из таблицы Start переносились в шаблон (имена шаблонов меняются, поэтому я добавила выбор файла). В данном примере файл Finish. Перенос данных осуществляется по правилу: первая колонка = имя листа, куда переносить. Остальные колонки переносятся на эти листы.
Строка Format$(0, A(i, 1)) имеет такой вид, потому что мне необходимо чтобы "0" в названии листов учитывался.
Помогите, пожалуйста, понять и исправить, чего от меня хочет этот UBound.
Код
Sub Magic()
    Dim A, Sh, i%, LastRow&, OpenFile
    A = ThisWorkbook.Worksheets(1).[A1].CurrentRegion
    'диалоговое окно для выбора файла'
    OpenFile = Application.GetOpenFilename _
                ("Excel files(*.xls*),*.xls*", 1, "Выбрать шаблон для заполнения", , False)
                    If VarType(OpenFile) = vbBoolean Then
        Exit Sub
         End If
         Workbooks.Open OpenFile
    For Each Sh In Workbooks(Workbooks.Count).Worksheets
    Next Sh
    For i = 1 To UBound(A)
        A(i, 1) = Format$(0, A(i, 1)) 'формат листа'
        With Workbooks(Workbooks.Count)
                With .Worksheets(A(i, 1))
                LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                If IsEmpty(.[A1]) Then LastRow = 1
                .Cells(LastRow, 1) = A(i, 2)
                .Cells(LastRow, 2) = A(i, 3)
                .Cells(LastRow, 3) = A(i, 4)
                End With
        End With
    Next i
End Sub
Function SheetExists(SheetName, Optional wb As Workbook) As Boolean
    If wb Is Nothing Then Set wb = ActiveWorkbook
    On Local Error Resume Next: SheetExists = wb.Worksheets(SheetName).Name = SheetName: Err.Clear
End Function
Изменено: eonka - 18.11.2022 08:04:27
Страницы: 1
Наверх