Макрос excel вставка таблицы

В этом уроке я покажу Вам самые популярные макросы в VBA Excel, которые вы сможете использовать для оптимизации своей работы. VBA — это язык программирования, который может использоваться для расширения возможностей MS Excel и других приложений MS Office. Это чрезвычайно полезно для пользователей MS Excel, поскольку VBA может использоваться для автоматизации вашей работы и значительно увеличить Вашу эффективность. В этой статье Вы познакомитесь с VBA и я вам покажу некоторые из наиболее полезных, готовых к использованию примеров VBA. Вы сможете использовать эти примеры для создания собственных скриптов, соответствующих Вашим потребностям.

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

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

Table of Contents

Как включить макросы в Excel

В Excel нажмите комбинацию клавиш alt + F11. Это приведет вас к редактору VBA в MS Excel. Затем щелкните правой кнопкой мыши папку Microsoft Excel Objects слева и выберите Insert => Module. Это место, где сохраняются макросы. Чтобы использовать макрос, вам нужно сохранить документ Excel как макрос. Из табуляции File => Save as, выберите Save as macro-enabled Workbok (расширение .xlsm) Теперь пришло время написать свой первый макрос!

1. Копирование данных из одного файла в другой.

Очень полезный макрос, поскольку он показывает, как скопировать ряд данных изнутри vba и как создать и назвать новую книгу. Вы можете изменить этот макрос в соответствии с вашими собственными требованиями:

Sub CopyFiletoAnotherWorkbook()
    
        Sheets("Example 1").Range("B4:C15").Copy
    
        Workbooks.Add
    
        ActiveSheet.Paste
    
        Application.DisplayAlerts = False
    
        ActiveWorkbook.SaveAs Filename:="C:TempMyNewBook.xlsx"
    
        Application.DisplayAlerts = True
End Sub

2. Отображение скрытых строк

Иногда большие файлы Excel можно содержать скрытые строки для большей ясности И для лучшего удобства пользователей. Вот один макрос, который отобразит все строки из активной рабочей таблицы:

Sub ShowHiddenRows()
    Columns.EntireColumn.Hidden = False
    Rows.EntireRow.Hidden = False
End Sub

3. Удаление пустых строк и столбов

Пустые строки в Excel — может быть проблемой для обработки данных. Вот как избавиться от них:

Sub DeleteEmptyRowsAndColumns()
    
        Dim MyRange As Range
        Dim iCounter As Long
    
        Set MyRange = ActiveSheet.UsedRange
        
        For iCounter = MyRange.Rows.Count To 1 Step -1
    
           If Application.CountA(Rows(iCounter).EntireRow) = 0 Then
               Rows(iCounter).Delete
               
               
           End If
    
        Next iCounter
    
        For iCounter = MyRange.Columns.Count To 1 Step -1
    
               If Application.CountA(Columns(iCounter).EntireColumn) = 0 Then
                Columns(iCounter).Delete
               End If
    
        Next iCounter      
End Sub

4. Нахождение пустых ячеек

Sub FindEmptyCell()
    ActiveCell.Offset(1, 0).Select
       Do While Not IsEmpty(ActiveCell)
          ActiveCell.Offset(1, 0).Select
       Loop
End Sub

#### 5. Заполнение пустых ячеек

Как упоминалось ранее, пустые ячейки препятствуют обработке данных и созданию сводных таблиц. Вот один примерный код, который заменяет все пустые ячейки на 0. Этот макрос имеет очень большое приложение, потому что Вы можете использовать его для поиска и замены результатов N/A, а также других символов, таких как точки, запятые или повторяющиеся значения:

Sub FindAndReplace()
    
        Dim MyRange As Range
        Dim MyCell As Range
    
        Select Case MsgBox("Can't Undo this action.  " & _
                            "Save Workbook First?", vbYesNoCancel)
            Case Is = vbYes
            ThisWorkbook.Save
            Case Is = vbCancel
            Exit Sub
        End Select
    
        Set MyRange = Selection
    
        For Each MyCell In MyRange
    
            If Len(MyCell.Value) = 0 Then
                MyCell = 0
            End If
    
        Next MyCell
End Sub

#### 6. Сортировка данных

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

NB: Здесь нам нужно поставить этот код в Sheet1 (папка Microsoft Excel Objects), а не в Module1 (папка Modules):

Private Sub Worksheet_BeforeDoubleClick (ByVal Target as Range, Cancel As Boolean)
    
        Dim LastRow As Long
    
        LastRow = Cells (Rows.Count, 1) .End (xlUp) .Row
    
        Rows ("6:" & LastRow) .Sort _
        Key1: = Cells (6, ActiveCell.Column), _
        Order1: = xlAscending
End Sub

#### 7. Удаление пустых пространств

Иногда данные в книге содержат дополнительные пробелы (whitespace charachters), которые могут мешать анализу данных и коррумпировать формулы. Вот один макрос, который удалит все пробелы из предварительно выбранного диапазона ячеек:

Sub TrimTheSpaces()
    
        Dim MyRange As Range
        Dim MyCell As Range
    
        Select Case MsgBox("Can't Undo this action.  " & _
                            "Save Workbook First?", vbYesNoCancel)
            Case Is = vbYes
            ThisWorkbook.Save
            Case Is = vbCancel
            Exit Sub
        End Select
    
        Set MyRange = Selection
    
        For Each MyCell In MyRange
    
            If Not IsEmpty(MyCell) Then
                MyCell = Trim(MyCell)
            End If
    
        Next MyCell
End Sub

#### 8. Выделение дубликатов цветом

Иногда в нескольких столбцах, которые мы хотели бы осветить, есть повторяющиеся значения. Этот макрос делает именно это:

Sub HighlightDuplicates()
    
        Dim MyRange As Range
        Dim MyCell As Range
    
        Set MyRange = Selection 
    
        For Each MyCell In MyRange 
    
            If WorksheetFunction.CountIf(MyRange, MyCell.Value) > 1 Then
                MyCell.Interior.ColorIndex = 36
            End If
    
        Next MyCell
End Sub

#### 9. Выделение десяти самых высоких чисел

Этот код будет отображать десять самых высоких чисел из набора ячеек:

Sub TopTen()
    Selection.FormatConditions.AddTop10
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1)
            .TopBottom = xlTop10Top
            
            .Rank = 10
            .Percent = False
        End With
        With Selection.FormatConditions(1).Font
            .Color = -16752384
            .TintAndShade = 0
        End With
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .Color = 13561798
            .TintAndShade = 0
        End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

Вы можете легко настроить код, чтобы выделить различное количество чисел.

#### 10. Выделение данных больших чем данные число

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

Sub HighlightGreaterThanValues()
    Dim i As Integer
    i = InputBox("Enter Greater Than Value", "Enter Value")
    Selection.FormatConditions.Delete
    
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:=i
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1)
            .Font.Color = RGB(0, 0, 0)
            .Interior.Color = RGB(31, 218, 154)
        End With
End Sub

Вы тоже можете настроить этот код, чтобы выделить более низкие чисел.

#### 11. Выделение ячеек комментариями
Простой макрос, который выделяет все ячейки, содержащие комментарии:

Sub HighlightCommentCells()
    Selection.SpecialCells(xlCellTypeComments).Select
    Selection.Style= "Note"
End Sub

#### 12. Выделение ячеек со словами с ошибками

Это очень полезно, когда вы работаете с функциями, которые принимают строки, однако кто-то ввел строку с ошибкой, и ваши формулы не работают. Вот как решить эту проблему:

 Sub ColorMispelledCells()
    For Each cl In ActiveSheet.UsedRange
        If Not Application.CheckSpelling(Word:=cl.Text) Then _
        cl.Interior.ColorIndex = 28
    Next cl
End Sub

13. Создание сводной таблицы

Вот как создать сводную таблицу в MS Excel (версия 2007). Особенно полезно, когда вы делаете индивидуальный отчет каждый день. Вы можете оптимизировать создание сводной таблицы следующим образом:

Sub PivotTableForExcel2007()
    Dim SourceRange As Range
    Set SourceRange = Sheets("Sheet1").Range("A3:N86")
    ActiveWorkbook.PivotCaches.Create( _
    SourceType:=xlDatabase, _
    SourceData:=SourceRange, _
    Version:=xlPivotTableVersion12).CreatePivotTable _
    TableDestination:="", _
    TableName:="", _
    DefaultVersion:=xlPivotTableVersion12
End Sub

14. Отправка активного файла по электронной почте

Мой любимый код VBA. Он позволяет вам прикреплять и отправлять файл, с которым вы работаете, с предопределенным адресом электронной почты, заголовком сообщения и телом сообщения! Сначала Вам нужно сделать референцию в Excel на Microsoft Outlook (в редакторе Excel VBA, нажмите tools => references и выберите Microsoft Outlook).

Sub SendFIleAsAttachment()
    
    
        Dim OLApp As Outlook.Application
        Dim OLMail As Object
    
        Set OLApp = New Outlook.Application
        Set OLMail = OLApp.CreateItem(0)
        OLApp.Session.Logon  
    
        With OLMail
        .To = "admin@datapigtechnologies.com; mike@datapigtechnologies.com"
        .CC = ""
        .BCC = ""
        .Subject = "This is the Subject line"
        .Body = "Hi there"
        .Attachments.Add ActiveWorkbook.FullName
        .Display  
        End With
    
        Set OLMail = Nothing
        Set OLApp = Nothing
End Sub

15. Вставка всех графиков Excel в презентацию PowerPoint

Очень удобный макрос, который позволяет вам добавлять все ваши графики Excel в презентацию Powerpoint одним щелчком мыши:

Sub SendExcelFiguresToPowerPoint()
    
    
        Dim PP As PowerPoint.Application
        Dim PPPres As PowerPoint.Presentation
        Dim PPSlide As PowerPoint.Slide
        Dim i As Integer
    
        Sheets("Slide Data").Select
            If ActiveSheet.ChartObjects.Count < 1 Then
                MsgBox "No charts existing the active sheet"
                Exit Sub
            End If
    
        Set PP = New PowerPoint.Application
        Set PPPres = PP.Presentations.Add
        PP.Visible = True
    
            For i = 1 To ActiveSheet.ChartObjects.Count
            
                ActiveSheet.ChartObjects(i).Chart.CopyPicture _
                Size:=xlScreen, Format:=xlPicture
                Application.Wait (Now + TimeValue("0:00:1"))
            
                ppSlideCount = PPPres.Slides.Count
                Set PPSlide = PPPres.Slides.Add(SlideCount + 1, ppLayoutBlank)
                PPSlide.Select
            
                PPSlide.Shapes.Paste.Select
                PP.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
                PP.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True
            Next i
    
        Set PPSlide = Nothing
        Set PPPres = Nothing
        Set PP = Nothing
End Sub

16. Вставка таблицы Excel в MS Word

Таблицы Excel обычно помещаются внутри текстовых документов. Вот один автоматический способ экспорта таблицы Excel в MS Word:

 Sub ExcelTableInWord()
    
    
        Dim MyRange As Excel.Range
        Dim wd As Word.Application
        Dim wdDoc As Word.Document
        Dim WdRange As Word.Range
    
       Sheets("Revenue Table").Range("B4:F10").Cop
    
        Set wd = New Word.Application
        Set wdDoc = wd.Documents.Open _
        (ThisWorkbook.Path & "" & "PasteTable.docx")
        wd.Visible = True
    
        Set WdRange = wdDoc.Bookmarks("DataTableHere").Rangе
    
        On Error Resume Next
        WdRange.Tables(1).Delete
        WdRange.Paste 
    
        WdRange.Tables(1).Columns.SetWidth _
        (MyRange.Width / MyRange.Columns.Count), wdAdjustSameWidth
    
        wdDoc.Bookmarks.Add "DataTableHere", WdRange
    
        Set wd = Nothing
        Set wdDoc = Nothing
        Set WdRange = Nothing
End Sub

17. Извлечение слов из текста

Мы можем использовать формулы, если хотим извлечь определенное количество символов. Но что, если мы хотим извлечь только одно слово из предложения или диапазон слов в ячейке? Для этого мы можем сами создать функцию Excel с помощью VBA. Это одна из самых удобных функций VBA, поскольку она позволяет создавать собственные формулы, которые отсутствуют в MS Excel. Давайте продолжим и создадим две функции: findword() и findwordrev():

Function FindWord(Source As String, Position As Integer) As String
     On Error Resume Next
     FindWord = Split(WorksheetFunction.Trim(Source), " ")(Position - 1)
     On Error GoTo 0
End Function

Function FindWordRev(Source As String, Position As Integer) As String
     Dim Arr() As String
     Arr = VBA.Split(WorksheetFunction.Trim(Source), " ")
     On Error Resume Next
     FindWordRev = Arr(UBound(Arr) - Position + 1)
     On Error GoTo 0
End Function

Отлично, мы уже создали две новые функции в Excel! Теперь попробуйте использовать их в Excel. Функция = FindWordRev (A1,1) берет последнее слово из ячейки A1. Функция = FindWord (A1,3) берет третье слово из ячейки A1 и т. Д.

18. Защита данных в MS Excel

Иногда мы хотим защитить данных нашего файла, чтобы только мы могли его изменять. Вот как это сделать с VBA:

Sub ProtectSheets()
    
        Dim ws As Worksheet
    
        For Each ws In ActiveWorkbook.Worksheets
    
        ws.Protect Password:="1234"
        Next ws
End Sub

Поздравления! Поскольку вы все еще читаете это, вы действительно заинтересованы в изучении VBA. Как вы уже сами видели, язык программирования VBA чрезвычайно полезен и может сэкономить нам много времени. Надеюсь, вы нашли эту информацию полезной и использовали ее, чтобы стать мастером MS Excel, VBA и компьютерных наук в целом.

© 2018 Атанас Йонков


Литература:
1. ExcelChamps.com: Top 100 Useful Excel Macro [VBA] Codes Examples.
2. Michael Alexander, John Walkenbach (2012). 101 Ready-To-Use Excel Macros.
3. BG Excel.info: 14 ready-to-use Macros for Excel.

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

Добрый день!

Помогите пожалуйста «допилить» макрос, который копировал бы таблицу в диапазоне А33:Y63 (файл приложен — Лист «TM1-D» ) и вставлял бы ее внизу. Сейчас макрос написан так, что таблица вставляется постоянно в Range («A64» ) — между таблицами STRAKE: A и STRAKE: F. Я знаю что надо заменить «закрепленную» область Range («A64» ) переменной, однако у меня не получается. Я пробовал использовать циклы Do…Loop и переменный оператор Dim, но, видимо, не до конца все понимаю. Очень важно, чтобы с моего макроса осталось выполнение условия защищенности документа. Заранее премного благодарен.

ЗЫ. Я честно искал похожую проблему в других темах, но поиск ничего не дал(.
ЗЫЫ.Кнопки АктивХ внизу таблиц рабочие.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#2

11.07.2014 15:59:28

Поиск первой пустой строки в столбце (в данном случае 4 — «D»)

Код
Dim lRws As Long
        lRws = Cells(Rows.Count, 4).End(xlUp).Row + 1
 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

vikttur, Спасибо за ответ большое и за помощь…но что то не получается у меня. Вместо своей строки Range(«N64» ).Select вставляю Ваш код, нажимаю F5 для проверки и получаю ошибку «Compile Error». При этом выделяется .Cells в коде. Я не совсем понимаю синтаксис этих 2-х строк, поэтому не знаю где исправлять у себя код.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Переменная lRws. Первая пустая строка. Номер строки — в переменную.
Вместо Range(«N64» ).Select:
Range(«N» & lRws).Select
Хотя это неправильно и выделять не нужно.

Файл 74 кБ с пустыми таблицами. Достаточно одной с десятком строк.
Ошибка. Искать строку, вставлять туда переменную… Ой, не та строка… Опять искать…
Ошибка у Вас? Показали, где, чтобы не рыться.

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

#5

11.07.2014 18:30:47

Цитата
vikttur пишет: Переменная lRws. Первая пустая строка. Номер строки — в переменную.

Не получается у меня. Не знаю как соединить нужные коды. Прошу помощи. Вот код с уже вставленными строками. Ошибку теперь выдает в строке «Dim lRws As Long»

Код
    Range("N" & lRws).Select
    Dim lRws As Long
    lRws = Cells(Rows.Count, 4).End(xlUp).Row + 1
  

Изменено: versus198211.07.2014 19:50:39

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

versus1982

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

Dim lRws два раза, переменная обозначается один раз, после названия процедуры.
Просил показать место ошибки и в файле.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#7

11.07.2014 18:42:07

Если я не ошибаюсь, то переменную сначала объявляют, а потом используют.

Код
    Range("N" & lRws).Select
    Dim lRws As Long

Поменяйте строки местами.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#8

11.07.2014 18:52:59

Цитата
Ошибку выдает в строке «Dim lRws As Long»

Сначала это, потом и то.

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

Извините, исправил по требованию, не понял просто как показать ошибку. Спасибо за помощь большое уже завтра попробую ее применить к своему коду. И отпишусь.

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

#10

14.07.2014 12:33:14

Добрый всем утро! vikttur, с ошибкой в коде разобрался, однако, если я его введу по вышеуказанным рекомендациям —>,

Код
Dim lRws As Long
    Range("A7" & lRws).Select
    lRws = Cells(Rows.Count, 4).End(xlUp).Row + 1
 

то таблицы вставляются не друг за другом как необходимо, а как и раньше у меня происходило, с той лишь разницей что первая вставленная таблица действительно вставляется в конце (то есть на A70). Последующие же таблицы вставляются так же в А70, подвигая вниз предыдущую. Надеюсь понятно написал)

Еще для меня загадкой оказалось, что «А7» в команде Range применяет (выделяет) ячейку А70, а как тогда получить ячейку А64, например?
Заранее благодарен.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#11

14.07.2014 12:40:49

Вы будете сыты в обед, если кушать нечего, а приготовление борща — вечером? Сначала найти величину переменной, потом ее применять.

Цитата
«А7» в команде Range применяет (выделяет) ячейку А70

Именно поэтому. Например, lRws=25:
«A7» & lRws = «A7» & 25 = «A725»
Но это пример, у Вас же переменная еще — 0.
И, наверное, семерка лишняя.

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

#12

15.07.2014 16:11:12

Всем привет! Спасибо огромное за помощь — благодаря Вам нашел такой способ вставки таблицы в конце:

Код
Range("A33:Y63").Copy Cells(Rows.Count, 1).End(xlUp).Offset(1)
       
 

т.е. убрал лишние «Select», и код на вставку таблицы в конце вместился в одну строку. Но у меня другая теперь проблема — мне необходимо перед вставкой таблицы, первую пустую строку сделать высотой 40 экселевских единиц. Я уже знаю (благодаря Вам), что эту строку могу найти процедурой:

Код
Dim lRws As Long
    lRws = Cells(Rows.Count, 1).End(xlUp).Row + 1
 

т.е., как я понимаю, он находит последнюю заполненную ячейку в столбце «А» и переходит на следующую (которая пустая), но происходит все не так. При первом выполнении макроса он выполняет высоту строки 40 абсолютно любую заполненную ячейку в пределах 2-й таблицы, при каждом выполнении макроса (обновленный файл прилагаю). При этом таблицы — все нормально вставляются себе как надо друг за дружкой. Обидно, что не понимаю почему так происходит. На данный момент код имеет такой вид :

Код
 Sub AddSheetTM1D()
'
' AddSheetTM1D Makros
'
ActiveSheet.Unprotect
Dim lRws As Long
    lRws = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Selection.RowHeight = 40
    Range("A33:Y63").Copy Cells(Rows.Count, 1).End(xlUp).Offset(1)
        Application.CutCopyMode = False
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
        AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
        :=True
End Sub

Прикрепленные файлы

  • MSR TM Prototype.xlsm (40.57 КБ)

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

замените строку Selection….. на Rows(lRws)….

Согласие есть продукт при полном непротивлении сторон.

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

Ой спасибо огромное — все сработало. Супер!

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

Всем привет!

Решил пойти еще дальше (затягивает зараза). Теперь вместо фиксированного Range («A33:Y63» ) необходимо, чтобы макрос определял последнюю таблицу затем копировал ее и вставлял в конце. Т.е. Range попадает в переменную. Таблица имеет фиксированно 30 строк (см.вложенный файл). В соседних темах были близкие ответы, по выбору диапазонов, но у меня не получается применить их решение.  

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

#16

16.07.2014 17:35:39

Можно было бы использовать вот это, наверное:

Код
ActiveSheet.UsedRange.Find("Strake", , xlFormulas, xlWhole)
 

но как описать чтобы этот заголовок «Strake» макрос находил в последней таблице (этот заголовок есть в каждой таблице) и выделял последующие 30 строк?

Изменено: versus198216.07.2014 17:36:19

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

#17

16.07.2014 20:32:56

У метода Find есть аргумент, который определяет направление поиска. Вам нужно найти последнее значение? — тогда «снизу — вверх»

Код
SearchDirection:=xlPrevious

 

Посмотрите справку по Find

 

versus1982

Пользователь

Сообщений: 23
Регистрация: 11.07.2014

#18

17.07.2014 12:37:05

Справку то я прочитал, но ! Я могу найти поиск по первой строке (например где есть текст «STRAKE» ) , после этого необходимо, чтобы макрос выполнил выделение таблицы в низ (на 30 строк). Я ввожу:

Код
ActiveSheet.UsedRange.Find("Strake", SearchDirection:=xlNext).Select
 

Но, во первых, «STRAKE» повторяется в каждой таблице, а во вторых как обозначить саму область в 30 строк после «STRAKE»? И честно говоря не совсем понимаю для чего применить LookAt и LookIn в моем случае? Помогите плз!

0 / 0 / 0

Регистрация: 28.02.2013

Сообщений: 6

1

Добавление новой таблицы кнопкой и макросом

28.02.2013, 17:46. Показов 2606. Ответов 9


Студворк — интернет-сервис помощи студентам

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



0



200 / 98 / 2

Регистрация: 24.09.2011

Сообщений: 261

01.03.2013, 09:38

2

чтобы добавить новую таблицу достаточно создать новый лист — кнопкой внизу экрана Excel или Shift+F11



1



0 / 0 / 0

Регистрация: 28.02.2013

Сообщений: 6

01.03.2013, 10:00

 [ТС]

3

Цитата
Сообщение от sulfur
Посмотреть сообщение

чтобы добавить новую таблицу достаточно создать новый лист — кнопкой внизу экрана Excel или Shift+F11

это не решит мою проблему но все равно спасибо, мне необходимо что бы все работало на одном листе



0



0 / 0 / 0

Регистрация: 28.02.2013

Сообщений: 6

01.03.2013, 12:40

 [ТС]

4

Цитата
Сообщение от MaximuZ
Посмотреть сообщение

Идея сделать небольшую прогу для учета абонентов но водоснабжению, проблема возникла в написании макроса для добавление в последующим порядке новой таблицы и графика с помощью кнопки, помогите кто чем может? Заранее приемного благодарен.

Например: в ячейках R7C3:R47C18 находится таблица, она сгруппирована 10Rx46R и в этой же таблице есть график он строится на =Лист1!R12C4:R22C16, вопрос возможно ли написать макрос для добавление в последующим ниже порядке (R48C3:R88C18) новой таблицы и графика с помощью кнопки при этом данные графика строились уже на =Лист1!R53C4:R63C16 и так после каждого нажатия кнопки?



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

01.03.2013, 14:06

5

Запиши макрос копирования и вставки блока и у тебя будет половина решения.
А со второй скорей всего придется писать вучную: изменение адресов рядов.

Добавлено через 10 минут
Назначение будет как-то так:

Visual Basic
1
2
3
4
5
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.PlotArea.Select
    Application.CutCopyMode = False
    ActiveChart.SeriesCollection(1).Values = "=Лист1!R56C6:R56C16"
    ActiveChart.SeriesCollection(1).Name = "=Лист1!R56C4"



1



MaximuZ

0 / 0 / 0

Регистрация: 28.02.2013

Сообщений: 6

01.03.2013, 15:38

 [ТС]

6

Цитата
Сообщение от Alex77755
Посмотреть сообщение

Запиши макрос копирования и вставки блока и у тебя будет половина решения.
А со второй скорей всего придется писать вучную: изменение адресов рядов.

Добавлено через 10 минут
Назначение будет как-то так:

Visual Basic
1
2
3
4
5
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.PlotArea.Select
    Application.CutCopyMode = False
    ActiveChart.SeriesCollection(1).Values = "=Лист1!R56C6:R56C16"
    ActiveChart.SeriesCollection(1).Name = "=Лист1!R56C4"

кнопка получится одноразовой а постоянен изменение адресов рядов вручную теряет смысл кнопки но все равно спасибо



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

01.03.2013, 15:41

7

кнопка получится одноразовой

Одноразавая в туалете бумага
А здесь привязка к номеру строки вполне многоразовая.
Придумать только метод обращения к нужной диаграмме



0



0 / 0 / 0

Регистрация: 28.02.2013

Сообщений: 6

01.03.2013, 16:27

 [ТС]

8

Цитата
Сообщение от Alex77755
Посмотреть сообщение

Одноразавая в туалете бумага
А здесь привязка к номеру строки вполне многоразовая.
Придумать только метод обращения к нужной диаграмме

Если идет выкачка из базы то можно воспользоваться надстройкой PowerPivot и напрямую все тянуть с помощью Екселя….возможные объемы более 10 мильенов строк…скорость фантастика….для многомерного анализа данных — просто сказка. А вот как сделать чтоб постоянно не менять адреса строк в макросе это вопрос?????



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

01.03.2013, 17:50

9

Лучше, как говорится, мухи отдельно — котлеты отдельно. Был вопрос один

проблема возникла в написании макроса для добавление новой таблицы с помощью кнопки

Посмотрев на файл первое что у меня возникло: Наверное там не больше дисятка клиентов, раз выбран такой формат: на каждого клиента своя диаграмма и пр. Если клиентов будет до 1000, то и книга будет весить много, да и наверняка начнутся тормоза. А теперь оказывается, что записей 10 мильонов строк.
Тогда надо сначала обрисовать общую задачу в общих чертах, потом ваше видение желаемого результата.
Если данные тянутся из базы, то зачем делать на каждого пользователя таблицу и график? выбрали из списка нужного клиента и в единственной таблице отображайте данные



0



0 / 0 / 0

Регистрация: 28.02.2013

Сообщений: 6

01.03.2013, 18:17

 [ТС]

10

Цитата
Сообщение от Alex77755
Посмотреть сообщение

Если данные тянутся из базы, то зачем делать на каждого пользователя таблицу и график? выбрали из списка нужного клиента и в единственной таблице отображайте данные

Идея про базу у меня возникла в процессе переписки на форуме, так что прости если что ни так)))) как говорится одна голова хорошо а две еще лучше)))))



0



Вставка таблицы Excel в документ Word с помощью кода VBA Excel. Метод Selection.PasteExcelTable: синтаксис, параметры, пример использования.

Работа с Word из кода VBA Excel
Часть 6. Вставка таблицы Excel в документ Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]

Метод Selection.PasteExcelTable

Метод Range.Paste, использующийся в VBA Word для вставки в документ таблиц, скопированных в буфер обмена из другого документа Word, не применим для вставки в документ таблиц, скопированных из книги Excel. Для этих целей используется метод Selection.PasteExcelTable.

Selection.PasteExcelTable — это метод, предназначенный для вставки Excel-таблицы из буфера обмена в документ Word и ее форматирования в соответствии с заданными параметрами.

Синтаксис

Expression.PasteExcelTable(LinkedToExcel, WordFormatting, RTF)

Expression — переменная, представляющая объект Selection. В том числе, это может быть курсор или закладка.

Параметры

Все параметры метода Selection.PasteExcelTable логического типа и являются обязательными.

Параметр Описание
LinkedToExcel True — вставленная таблица связывается с исходным файлом Excel, чтобы изменения, внесенные в файл Excel, отображались в Microsoft Word.
False — связь между вставленной таблицей и таблицей в исходном файле не устанавливается.
WordFormatting True — вставленная таблица будет отформатирована как таблица документа Word.
False — вставленная таблица будет отформатирована в соответствии с исходным файлом Excel.
RTF True — Excel-таблица будет вставлена в расширенном текстовом формате (RTF).
False — Excel-таблица будет вставлена в формате HTML-таблицы.

Допустим, у нас есть таблица Excel, начинающаяся с ячейки A1 (или с любой другой), и нам необходимо скопировать эту таблицу в существующий документ Word, вставив ее на место закладки «Закладка1».

Решение:

Sub Primer()

Dim myWord As New Word.Application, myDoc As Word.Document

‘Открываем существующий документ Word

Set myDoc = myWord.Documents.Open(«C:ТестоваяДокумент1.docx»)

‘Копируем таблицу на активном листе в буфер обмена

‘Вместо ячейки Range(«A1») можно указать любую другую, расположенную внутри таблицы

Range(«A1»).CurrentRegion.Copy

‘Вставляем таблицу из буфера обмена на место закладки

myDoc.Bookmarks(«Закладка1»).Range.PasteExcelTable False, False, False

‘Отображаем программу Word

myWord.Visible = True

‘Очищаем переменные

Set myWord = Nothing

Set myDoc = Nothing

End Sub

Если необходимо таблицу вставить в конец документа, строку

myDoc.Bookmarks(«Закладка1»).Range.PasteExcelTable False, False, False

следует заменить на

With myDoc

    ‘Переводим курсор в конец документа

    .Range(.Range.Characters.Count 1, .Range.Characters.Count 1).Select

    ‘Добавляем перенос строки, если необходимо

    .ActiveWindow.Selection.InsertAfter vbCr

    ‘Переводим курсор в конец документа

    .Range(.Range.Characters.Count 1, .Range.Characters.Count 1).Select

    ‘Вставляем таблицу из буфера обмена

    .ActiveWindow.Selection.PasteExcelTable False, False, False

End With


Автоматическая вставка таблиц

Lars

Дата: Среда, 06.06.2012, 22:15 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
0% ±


Здравствуйте! Прошу помощи.
Имеется файл эксель (приложил для ясности), где на листе «Фундамент» находятся «таблицы» с данными. Необходимо создать кнопку, по нажатию которой вставлялись бы новые аналогичные «таблицы». Знаний хватает на создание макроса вставки строк, а вот создать такой макрос — не хватает знаний. Это вообще реально и как можно реализовать? Заранее спасибо.

К сообщению приложен файл:

—__-.xlsx
(28.1 Kb)

Сообщение отредактировал LarsСреда, 06.06.2012, 22:47

 

Ответить

Lars

Дата: Среда, 06.06.2012, 22:47 |
Сообщение № 2

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
0% ±


Прикрепил файл, удалил ссылку. Извините smile

 

Ответить

Hugo

Дата: Среда, 06.06.2012, 22:57 |
Сообщение № 3

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Не вполне поятно, что именно нужно.
Попробуйте из модуля листа «Фундамент» выполнить такой код:
[vba]

Code

Sub dobavitj_tablicu()
     Dim r As Range
     Set r = [a1:i29]
     r.Copy Range(«E» & Rows.Count).End(xlUp).Offset(2, -4)
End Sub

[/vba]


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Lars

Дата: Среда, 06.06.2012, 23:13 |
Сообщение № 4

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
0% ±


Сейчас попробую объяснить несколько понятнее.
На листе «Фундамент» имеются две таблицы (назовем их так) с данными по фундаментам (Фундамент ленточный, Фундамент сваи), такие вот аналоги карточки материала, где ведутся все расчеты и выясняется стоимость того или иного материала. Стоит задача создать на листе «Фундамент» кнопку, которая по нажатии, будет создавать точно такие же таблицы как «Фундамент ленточный» и «Фундамент сваи», но с пустыми значениями через ячейку от предыдущей.

 

Ответить

Hugo

Дата: Четверг, 07.06.2012, 00:09 |
Сообщение № 5

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Ну тогда задайте сразу 8 или больше разных объектных переменных — на все постоянные значения и формулы суммирования, и раскопируйте их.
Примерно так — сделал для первой таблицы, продолжайте аналогично:

[vba]

Code

Sub dobavitj_tablicu()
       Dim r1 As Range, r2 As Range, r3 As Range, r4 As Range, tgt As Range
       Set r1 = [a1:e1]
       Set r2 = [a2:b11]
       Set r3 = [a12:d12]
       Set r4 = [e10:e12]
       Set tgt = Range(«E» & Rows.Count).End(xlUp).Offset(2, -4)
       r1.Copy tgt
       r2.Copy tgt.Offset(1)
       r3.Copy tgt.Offset(11)
       r4.Copy tgt.Offset(9, 4)
End Sub

[/vba]

Или проще — на дополнительном листе заполняете диапазон таблицами без данных и используете весь этот один диапазон как форму для копирования. Как в первом варианте кода.
Только нужно указать лист:
[vba]

Code

Set r = sheets(«формы»).[a1:i29]

[/vba]


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Lars

Дата: Четверг, 07.06.2012, 00:15 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
0% ±


Благодарю за помощь! Очень сильно помогли!)

 

Ответить

Lars

Дата: Четверг, 07.06.2012, 00:52 |
Сообщение № 7

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
0% ±


Hugo, да, простым вариантом все отлично работает. Добавил лист с формой, делаю с него копирование полей, на лист «Фундамент» повесил кнопку для выполнения макроса. По нажатии добавляются необходимые поля.
Правда, теперь есть к вам еще один вопрос, если не затруднит. При единичном нажатии кнопки — все работает, добавляются новые поля, как изначально и было необходимо. А можно ли как-нибудь сделать так, чтобы при повторном нажатии на кнопку, макрос добавлял снова такую же форму еще ниже, а не заменял предыдущую вставку?
Приложил файл с кнопкой, чтоб было понятнее.

К сообщению приложен файл:

—__.xlsm
(48.8 Kb)

 

Ответить

Hugo

Дата: Четверг, 07.06.2012, 13:07 |
Сообщение № 8

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Код так и задуман, но т.к. Вы изменили расположение данных, то нужно скорректировать и код.
Вот эта часть
[vba]

Code

Range(«E» & Rows.Count).End(xlUp)

[/vba]определяет последнюю занятую ячейку в столбце E, а эта
[vba][/vba]сдвиг от этой ячейки (ну это уже поняли).
Т.к. в Е нет данных в этой новой форме, то есть смысл поменять код например так:
[vba]

Code

r.Copy Range(«G» & Rows.Count).End(xlUp).Offset(3, -6)

[/vba]


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Lars

Дата: Четверг, 07.06.2012, 14:31 |
Сообщение № 9

Группа: Пользователи

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

Замечаний:
0% ±


Огромное спасибо за помощь! Все работает, новые поля добавляются, как того и требовалось.
Моей благодарности нет предела smile

 

Ответить

Валерий — shelesto@ya.ru

Дата: Суббота, 13.04.2013, 17:47 |
Сообщение № 10

Господа, а как в этом файле сделать, чтобы таблицы вставлялись не вниз, а справа. Как в этом коде указать, что таблицу нужно вставить в пустую строку СТРОКИ, а не СТОЛБЦА?

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Макрос excel вставить только значения
  • Макрос excel в примерах
  • Макрос excel в ворд
  • Макрос excel в exe
  • Макрос excel range value