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

Страницы: 1
[ Закрыто] Форматирование в word, форматирование таблиц в word с помощью VBA
 
Добрый день, Коллеги! Вопрос не по excel, но по vba. Из программы данные выгружаюдтся в word. Но совершенно не оптимизировано. В таблицах куча пустых строк, которые хорошо бы удалить. Начал макросить, столкнулся с проблемой скрытых символов в ячейках таблицы.

Прикладываю тестовый файл. Желтым выделены строки, которые после выполнения макроса redact должны удаляться, но пока что получается удалять лишь те строки, которые не содержат никаких значений. А строки с "-", "0" или "0,0" не удаляются.
Проверить значение ячейки i,j в таблице (t.Cell(i, j).Range.Text) совпадает с 0, - или 0,0 не получается никак. Помогите советом, в чем косяк.
Изменено: NikitaV - 13.05.2020 14:57:11
Способ обойти ошибку type mismatch
 
Добрый день. Прошу помочь в решении следующей проблемы: Есть таблица с данными. Хочу получить 2-ю таблицу, с данными первой, деленными на 1000. Обнаружил, что в случае, если в 1-й таблице есть ячейки с некорректными данными (текст, деление на 0, н/д и т.п), то простой макрос делящий ячейку на 1000 выдает type mismatch. В оригинальном файле исходные таблицы получают данные через формулы, и как раз часто бывает что деление на 0 случается. Можно конечно, написать кучу формул если(еош..), но это много. Уверен, есть способ в макросе предусмотреть ошибку и 1 строчкой прописать, что в случае ошибки значение таблицы 2 = 0. Подскажите, как это можно сделат. Для наглядности прикрепил файл с таблицей, где 1 значение не числовое(выделил желтым).
Почему при использовании метода Find ошибка: Run-time error '91'
 
добрый день. столкнулся с
Цитата
Run-time error '91':
Object varialble or With block variable not set.
код совершенно простой, ищем в строке 2 активного листа значение "П". определение переменной не помогает. Кто может подсказать в чем беда?
Код
Sub find_1()
Dim width As Long
With ActiveSheet
width = Rows(2).Find(What:="П", LookIn:=xlValues, SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Column
End With
End Sub
Вставка массива непустого массива в диапазон: вставляется пустота
 
добрый день.
помогите разобраться в чем может быть косяк.

Когда я присваиваю диапазону  значения массива, вставляется пустота, хотя массив состоит из текстовых элементов, что подтверждается msbox перед началом записи.
В нижеприведенном куске кода я присваиваю диапазону массив. Верхняя граница intersect = 1, т.е диапазон состоит из 1 ячейки.
Код
  Range(Cells(i + 1, 1), Cells(i + UBound(intersect, 1), width)).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Range(Cells(i + 1, 1), Cells(i + UBound(intersect, 1), 1)).Value = intersect

intersect был получен ранее в ходе выполнения процедуры arr_intersect , которая объединяет массивы, оставляя уникальные значения. Проверка msbox показывает, что в intersect записаны текстовые значения , и записаны правильно.
Код
intersect = arr_intersect(intersect, sp)
For m = 1 To UBound(intersect, 1)
                    MsgBox (intersect(m, 1))
Next m

Arr_intersect приведена ниже:
Код
Function arr_intersect(arr1() As String, arr2() As String)
 Dim arr3() As String
 Dim n As Integer, t As Integer, p As Integer
 On Error Resume Next
 If IsArrayEmpty(arr1) = False Then
    If IsArrayEmpty(arr2) = False Then
 n = 0
         For t = 1 To UBound(arr1, 1)
            For j = 1 To UBound(arr2, 1)
                If arr1(t, 1) = arr2(j, 1) Then
                n = n + 1
                End If
            Next
         Next
         ReDim arr3(1 To UBound(arr1, 1) + UBound(arr2, 1) - n, 1 To 1)
           For t = 1 To UBound(arr1, 1)
            arr3(t, 1) = arr1(t, 1)
      Next
       p = 0
        For j = 1 To UBound(arr2, 1)
        n = 0
            For t = 1 To UBound(arr1, 1)
              If arr2(j, 1) <> arr3(t, 1) Then
                n = n + 1
              End If
              Next
              If n = UBound(arr1) Then
                p = p + 1
                arr3(UBound(arr1, 1) + p, 1) = arr2(j, 1) 'записываем в конец новый элемент
              End If
        Next
arr_intersect = arr3
Else
arr_intersect = arr1
End If
Else
    If IsArrayEmpty(arr2) = False Then
    arr_intersect = arr2
   End If
End If
End Function

Проверка If IsArrayEmpty массива на пустоту , вроде была заимствована у ZVI.
Код
Function IsArrayEmpty(x) As Boolean
  Dim i&
  On Error Resume Next
  i = LBound(x, 1)
  IsArrayEmpty = Err <> 0
End Function

массив sp получался в результате обработки листа и получения списка значений в виде двумерного массива. В конкретном случае, он содержит 1 значение - слово.
Код
sp = ToInsert(kod, mas(1, k), mas(2, k))

Код
Function ToInsert(ByVal kod As String, ByVal name As String, ByVal bl_r As Integer) ', list1 As Worksheet)
Dim intersect() As String, sp() As String
Worksheets(name).Activate
   With ActiveSheet
   
        i = bl_r
       For i = bl_r To 6 Step -1
            j = 0
            If Cells(i, 2) = kod Then
               Do While Cells(i + 1 + j, 2) = ""
                   j = j + 1
               Loop
                If j > 0 Then
                ReDim sp(1 To j, 1)
                For k = 1 To UBound(sp, 1)
                    sp(k, 1) = Cells(i + k, 1).Value
                Next
                End If
            End If
        Next
    If IsArrayEmpty(sp) = True Then

    Erase sp
    ToInsert = sp
    Else
        ToInsert = sp
    End If
    End With
   End Function

Суть этой части программы в том, что по циклу пробегаем нужные листы, далее если в указанном столбце находим код, то берем в список sp значения из нижележащих ячеек соседнего столбца, у которых кода нет. Затем объединяем sp  и intersect (изначально пустой), переходим на следующий лист, опять заполняем sp, опять пересекаем и т.д. Затем в рабочем листе вставляем где нужно число строк соответствующее ubound(intersect,1) и значения intersect вставляется в ячейки. У меня строки добавляются, число строк правильное, но почему то диапазон заливается пустотой. Help.
почему значения массива не переносятся в диапазон, присваивания диапазону значений массива.
 
Столкнулся с проблемой переноса данных из массива в диапазон. Не хочу переносить по цику, ведь можно с помощью присваивания перенести, что значительно быстрее. Но как всегда что-то пошло не так. Не понимаю, почему когда выбираем диапазон range состоящий из 3 ячеек, двумерный массив не переносится на этот диапазон?
ниже небольшой макрос демонстрирующий эту проблему. Массив а - вертикальный, пытаемся записать его в вертикальный диапазон,  b - горизонтальный - пытаемся записать в горизонтальный диапазон. А с одномерными массивами, присваивание нормально работает только для горизонтальными диапазонами. В вертикальный переносится только 1-й элемент массива.

Код
Sub consolidation_balance()
'a-оранжевый, b - зеленый , с - желтый
Dim a(1 To 3, 1) As String, b(1, 1 To 3) As String, c(1 To 3) As String

For i = 1 To 3
    a(i, 1) = i
    b(1, i) = i
    c(i) = i
Next

Range(Cells(1, 1), Cells(3, 1)).Value = a

Range(Cells(1, 2), Cells(1, 4)).Value = b

Range(Cells(4, 1), Cells(6, 1)).Value = c
Range(Cells(1, 5), Cells(1, 7)).Value = c


End Sub
End Sub


Как мне добиться корректного переноса данны
Изменено: NikitaV - 29.01.2019 15:32:35
группировка пустых строк и столбцов. vba, как определить границы не сгруппированной зоны?
 
добрый день. написал нехитрый макрос, группирующий строки и столбцы. Теперь хочется его немного усовершенствовать. Сейчас он работает так: проверяет пустые/нулевые итоговые строки, и группирует столбцы. потом группирует строки у которых нулевой код. Я хочу добавить группировку еще и если строка вся нулевая(начиная с 3 толбца). Не могу понять, как можно определить границы оставшейся непустой области после того, как были сгруппированы столбцы, чтобы затем сгруппировать строки, сначала полностью пустые, а затем уже с нулевым кодом строки, чтобы получилось как на баланс2.
в приложенном файле - лист Баланс- то, что форматируем. После макроса-результат после выполнения макроса. ну и собственно-лист с тем, что Хотелось бы видеть, и лист с кнопкой макроса)
перенос данных из таблицы в таблицу. что-то не так с форматами?
 
Добрый день. Написал макрос, переносящий данные из одной таблицы в другую. Но как водится, что-то пошло не так. Дело в том, что второй файл, с которого я беру вторую таблицу, выгружается в формате xls из некой программы, и данные в нем видимо имеют какой то специфический формат. Подскажите, что можно добавить в макрос, чтобы он учитывал эту особенность. К сожалению данные залить не могу. Макрос рабочий, сравнивает значения 1-го столбца 1 и 2 таблицы, затем 1-й строки. В случае совпадения данные из 2 таблицы согласно координатам переносятся в 1 таблицу. Если шапки у таблиц тупо идентичные ( взяты из одного места или копированы друг с друга), то все работает. Если же вторая таблица выгружена и не отформатирована, то результата нет, данные не переносятся. Шапка таблицы 2 представляет собой дату типа I квартал 2017. И даже визуально , одинаковые казалось бы даты, отличаются. Как это устранить я не понимаю.

макрос
Код
Sub test3()
Dim table1 As Range, table2 As Range

Set n = Application.InputBox("выберите диапазон 1 таблицы", , , , , , , 8)
Set m = Application.InputBox("выберите диапазон 2 таблицы", , , , , , , 8)

n.Select
Set table1 = Selection
m.Select
Set table2 = Selection



For i = 2 To table1.Rows.Count

    For j = 2 To table2.Rows.Count
        If table1.Cells(i, 1).Value = table2.Cells(j, 1).Value Then
            For c = 2 To table1.Columns.Count
                For g = 2 To table2.Columns.Count
                    If table1.Cells(1, c).Value = table2.Cells(1, g).Value Then
                        table1.Cells(i, c).Value = table2.Cells(j, g).Value
                    End If
                Next
            Next
        End If
    Next
Next
 End Sub

=> должен из таблицы 2 перенести данные в соответствующие ячейки таблицы 1 (если совпали коды строк, и названия столбцов).

Также буду благодарен, если кто-то предложит как можно оптимизировать копирование данных из одного диапазона в другой. Последовательность вложенных циклов на мой взгляд довольно заморочна, но ничего лучше я придумать не смог.
Изменено: NikitaV - 23.01.2019 15:05:07
обработка диапазонов с использованием массивов: добавляет лишнюю строку с #Н/Д
 
Доброго дня! Всех с прошедшими праздниками! Делаю небольшой макрос по обработке файлов: по нажатию кнопки(кнопка1) отсматривает в текущей папке все файлы эксель, затем о очередно их открывает, и переносит данные на лист в рабочем файле. Все вроде работает, да вот при переносе добавляется строчка  #Н/Д. Уже перепробовал по всякому, не могу понять, почему он ее добавляет. Я использовал массивы для ускоренной вставки данных, может там чего-то, сам не допер. Посмотрите, если не сложно, где косяк в макросе у меня.
Изменено: NikitaV - 08.01.2019 00:14:13
Объединение таблиц Excel посредством PowerQuery, Параметризация запросов, объединение таблиц их файлов Excel из одной папки
 
Добрый день! Подскажите, пожалуйста, каким образом можно с помощью Power Query объединить таблицы из файлов Excel находящихся в одной папке. Я знаю - это должна быть комбинация из двух запросов - 1-й получение файлов из папки, второй - выгрузка из файла Excel. Целый день бьюсь, ничего не выходит. Посмотреть решение тоже негде, везде как то опускают эти тонкости , пишут - можно и все.

Стуктура запроса FromFolder для получения файлов из папки:
Код
let
    Источник = Folder.Files("F:\Обучение\макросы_тренинг\Power Query"),
    #"Другие удаленные столбцы" = Table.SelectColumns(Источник,{"Name"}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Другие удаленные столбцы", "Nam", each FromExcel),
    #"Развернутый элемент Nam" = Table.ExpandTableColumn(#"Добавлен пользовательский объект", "Nam", {"Сотрудник", "Оклад", "Дожность"}, {"Nam.Сотрудник", "Nam.Оклад", "Nam.Дожность"})
in
    #"Развернутый элемент Nam"
Скрытый текст


Структура запроса FromExcel для получения данных из Файла:
Код
let
    Источник = Excel.Workbook(File.Contents("F:\Обучение\макросы_тренинг\Power Query\ОМ.xlsx"), null, true),
    Лист1_Sheet = Источник{[Item="Лист1",Kind="Sheet"]}[Data],
    #"Повышенные заголовки" = Table.PromoteHeaders(Лист1_Sheet),
    #"Измененный тип" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Сотрудник", type text}, {"Оклад", Int64.Type}, {"Дожность", type text}}),
    #"Строки с применным фильтром" = Table.SelectRows(#"Измененный тип", each ([Дожность] = "нач"))
in
    #"Строки с применным фильтром"
Скрытый текст

Собственно, нужно каким то образом заменить имя "ОМ" на параметр. Я так думаю, параметр будет определяться в 1-м запросе - там ведь у нас имя файла есть..но как это осуществить..? Язык М не знаю, кто может для тупого объяснить?

PS Николай, было бы здорово, если бы вы начали добавлять на сайт ролики с применением PQ :)
Изменено: NikitaV - 08.05.2016 21:49:49
Заливка массива на лист через vba, макрос заливает лишь 1 элемент массива
 
Всем добрый день! Вопрос по VBA. Записал массив, теперь хочу его обратно вылить на др. лист. Пользуюсь следующим:
ActiveSheet.Range(Cells(2, 1), Cells(n + 1, 1)) = Array_Contragent_Name

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

С уважением, Никита.
[ Закрыто] вопрос по макросу, проставление формул при добавлении доп. строк
 
Добрый день. Может подскажет кто пример кода, который реализует копирование формул верхней строки при добавлении в таблицу доп. строк. Т.е у меня есть таблица, в каждой ячейке которой по строке забита формула некая. Мой макрос добавляет дополнительные строки в таблицу снизу, но формулы не проставляет, а очень хочется это также автоматизировать.
Изменено: NikitaV - 19.06.2014 16:53:13
Страницы: 1
Наверх