Vba excel выделение области

Определение адреса выделенного диапазона ячеек на листе Excel с помощью кода VBA. Определение номера первой и последней строки. Программное выделение диапазона.

Адрес выделенного диапазона

Для определения адреса выделенного диапазона ячеек в VBA Excel используется свойство Address объекта Selection.

Объект Selection — это совокупность всех выделенных ячеек на листе Excel. Это может быть одна ячейка, смежный или несмежный диапазон ячеек, представляющий коллекцию смежных диапазонов. Если выделение состоит из несмежного диапазона, адреса смежных диапазонов, из которых он состоит, будут перечислены через запятую.

Смежный диапазон — прямоугольная область смежных (прилегающих друг к другу) ячеек.

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

Стоит отметить: несмотря на то, что в выделенном диапазоне может содержаться много ячеек, активной может быть только одна. Она представлена объектом ActiveCell. Для определения ее адреса в коде VBA Excel также используется свойство Address.

Sub Primer1()

MsgBox «Адрес выделенного диапазона: « & Selection.Address & _

vbNewLine & «Адрес активной ячейки: « & ActiveCell.Address & _

vbNewLine & «Номер строки активной ячейки: « & ActiveCell.Row & _

vbNewLine & «Номер столбца активной ячейки: « & ActiveCell.Column

End Sub

Скопируйте и запустите код на выполнение. В результате получите что-то вроде этого, зависящее от того, какие диапазоны вы выберите:

Информационное окно с адресами выделенного диапазона и активной ячейки

Определение адресов выделенного диапазона и активной ячейки

Выделение ячеек и диапазонов

Выделить несмежный диапазон ячеек можно следующим образом:

Sub Primer2()

Range(«B4:C7,E5:F7,D8»).Select

End Sub

Как видно из примера, в адресной строке объекта Range перечисляются адреса смежных диапазонов, составляющих общий несмежный диапазон, через запятую. Выделение осуществляется методом Select объекта Range.

Определение номеров первой и последней строки

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

Sub Primer3()

Dim i1 As Long, i2 As Long

i1 = Selection.Cells(1).Row

i2 = Selection.Cells(Selection.Cells.Count).Row

MsgBox «Первая строка: « & i1 & _

vbNewLine & «Последняя строка: « & i2

End Sub

Результат будет таким, зависит от выделенного диапазона:

Информационное окно с номерами первой и последней строки диапазона

Номера первой и последней строки выделенного смежного диапазона

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

Обратите внимание, что для несмежных диапазонов этот пример не работает.

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



Download Article


Download Article

This wikiHow teaches you how to start using Visual Basic procedures to select data in Microsoft Excel. As long as you’re familiar with basic VB scripting and using more advanced features of Excel, you’ll find the selection process pretty straight-forward.

  1. 1

    Select one cell on the current worksheet. Let’s say you want to select cell E6 with Visual Basic. You can do this with either of the following options:[1]

    ActiveSheet.Cells(6, 5).Select
    

    ActiveSheet.Range("E6").Select
    
  2. 2

    Select one cell on a different worksheet in the same workbook. Let’s say our example cell, E6, is on a sheet called Sheet2. You can use either of the following options to select it:

    Application.Goto ActiveWorkbook.Sheets("Sheet2").Cells(6, 5)
    
    Application.Goto (ActiveWorkbook.Sheets("Sheet2").Range("E6"))
    

    Advertisement

  3. 3

    Select one cell on a worksheet in a different workbook. Let’s say you want to select a cell from Sheet1 in a workbook called BOOK2.XLS. Either of these two options should do the trick:

    Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Cells(2,1)
    
    Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("A2")
    
  4. 4

    Select a cell relative to another cell. You can use VB to select a cell based on its location relative to the active (or a different) cell. Just be sure the cell exists to avoid errors. Here’s how to use :

    • Select the cell three rows below and four columns to the left of the active cell:

      ActiveCell.Offset(3, -4).Select
      
    • Select the cell five rows below and four columns to the right of cell C7:

      ActiveSheet.Cells(7, 3).Offset(5, 4).Select
      
  5. Advertisement

  1. 1

    Select a range of cells on the active worksheet. If you wanted to select cells C1:D6 on the current sheet, you can enter any of the following three examples:

    ActiveSheet.Range(Cells(1, 3), Cells(6, 4)).Select
    
    ActiveSheet.Range("C1:D6").Select
    
    ActiveSheet.Range("C1", "D6").Select
    
  2. 2

    Select a range from another worksheet in the same workbook. You could use either of these examples to select cells C3:E11 on a sheet called Sheet3:

    Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("C3:E11")
    
    Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("C3", "E11")
    
  3. 3

    Select a range of cells from a worksheet in a different workbook. Both of these examples would select cells E12:F12 on Sheet1 of a workbook called BOOK2.XLS:

    Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E12:F12")
    
    Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E12", "F12")
    
  4. 4

    Select a named range. If you’ve assigned a name to a range of cells, you’d use the same syntax as steps 4-6, but you’d replace the range address (e.g., «E12», «F12») with the range’s name (e.g., «Sales»). Here are some examples:

    • On the active sheet:

      ActiveSheet.Range("Sales").Select
      
    • Different sheet of same workbook:

      Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("Sales")
      
    • Different workbook:

      Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("Sales")
      
  5. 5

    Select a range relative to a named range. The syntax varies depending on the named range’s location and whether you want to adjust the size of the new range.

    • If the range you want to select is the same size as one called Test5 but is shifted four rows down and three columns to the right, you’d use:
      ActiveSheet.Range("Test5").Offset(4, 3).Select
      
    • If the range is on Sheet3 of the same workbook, activate that worksheet first, and then select the range like this:
      Sheets("Sheet3").Activate ActiveSheet.Range("Test").Offset(4, 3).Select
      
  6. 6

    Select a range and resize the selection. You can increase the size of a selected range if you need to. If you wanted to select a range called Database’ and then increase its size by 5 rows, you’d use this syntax:

    Range("Database").Select Selection.Resize(Selection.Rows.Count + 5, _Selection.Columns.Count).Select
    
  7. 7

    Select the union of two named ranges. If you have two overlapping named ranges, you can use VB to select the cells in that overlapping area (called the «union»). The limitation is that you can only do this on the active sheet. Let’s say you want to select the union of a range called Great and one called Terrible:

    • Application.Union(Range("Great"), Range("Terrible")).Select
      
    • If you want to select the intersection of two named ranges instead of the overlapping area, just replace Application.Union with Application.Intersect.
  8. Advertisement

  1. 1

    Use this example data for the examples in this method. This chart full of example data, courtesy of Microsoft, will help you visualize how the examples behave:[2]

    A1: Name B1: Sales C1: Quantity
    A2: a B2: $10 C2: 5
    A3: b B3: C3: 10
    A4: c B4: $10 C4: 5
    A5: B5: C5:
    A6: Total B6: $20 C6: 20
  2. 2

    Select the last cell at the bottom of a contiguous column. The following example will select cell A4:

    ActiveSheet.Range("A1").End(xlDown).Select
    
  3. 3

    Select the first blank cell below a column of contiguous cells. The following example will select A5 based on the chart above:

    ActiveSheet.Range("A1").End(xlDown).Offset(1,0).Select
    
  4. 4

    Select a range of continuous cells in a column. Both of the following examples will select the range A1:A4:

    ActiveSheet.Range("A1", ActiveSheet.Range("a1").End(xlDown)).Select
    
    ActiveSheet.Range("A1:" & ActiveSheet.Range("A1"). End(xlDown).Address).Select
    
  5. 5

    Select a whole range of non-contiguous cells in a column. Using the data table at the top of this method, both of the following examples will select A1:A6:

    ActiveSheet.Range("A1",ActiveSheet.Range("A65536").End(xlUp)).Select
    
    ActiveSheet.Range("A1",ActiveSheet.Range("A65536").End(xlUp)).Select
    
  6. Advertisement

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

Video

  • The «ActiveSheet» and «ActiveWorkbook» properties can usually be omitted if the active sheet and/or workbook(s) are implied.

Thanks for submitting a tip for review!

Advertisement

About This Article

Article SummaryX

1. Use ActiveSheet.Range(«E6»).Select to select E6 on the active sheet.
2. Use Application.Goto (ActiveWorkbook.Sheets(«Sheet2»).Range(«E6»)) to select E6 on Sheet2.
3. Add Workbooks(«BOOK2.XLS») to the last step to specify that the sheet is in BOOK2.XLS.

Did this summary help you?

Thanks to all authors for creating a page that has been read 167,714 times.

Is this article up to date?

VBA Selection Range

Excel VBA Selection Range

We all might have seen the process where we need to select the range so that we could perform some work on it. This is the basic step towards any task we do in Excel. If we do any manual work, then we can select the range of cells manually. But, while automating any process or work it is necessary to automate the process of Selection of Range as well. And VBA Selection Range is the basic steps toward any VBA code. When we write the steps for Selection of Range, their Range becomes the Object and Selection becomes the property. Which means the cells which we want to select are Objects and selection process of the property in VBA Selection Range.

How to Select a Range in Excel VBA?

We will learn how to select a range in Excel by using the VBA Code.

You can download this VBA Selection Range Excel Template here – VBA Selection Range Excel Template

Excel VBA Selection Range – Example #1

In the first example, we will see a very simple process where we will be selecting any range of cells using VBA code. For this, follow the below steps:

Step 1: Open a Module from the Insert menu tab where we will be writing the code for this.

Insert a Module

Step 2: Write the subcategory of VBA Selection Range or we can choose any other name as per our choice to define it.

Code:

Sub Selection_Range1()

End Sub

VBA Selection Range Example 1-2

Step 3: Now suppose, we want to select the cells from A1 to C3, which forms a matrix box. Then we will write Range and in the brackets, we will put the cells which we want to select.

Code:

Sub Selection_Range1()

Range("A1:C3")

End Sub

Range Example 1-3

Step 4: Now we have covered the cells. Further, we can apply any function to it. We can select the cells, select the values it has or copy the selected range as well. Here we will simply select the range.

Code:

Sub Selection_Range1()

Range("A1:C3").Select

End Sub

VBA Selection Range Example 1-4

Step 5: Now compile the code and run it by clicking on the Play button located below the menu bar. We will see the changes in the current sheet as cells from A1 to C3 are selected as shown below.

VBA Selection Range Example 1-5

In a similar way, we can put any value to selected range cells. For this we will use Value function instead of Select.

Code:

Sub Selection_Range2()

Range("A1:C3").Value

End Sub

VBA Selection Range Example 1-6

Now assign any value or text which we want to see in the selected range cells. Here that value is My Range.

Code:

Sub Selection_Range2()

Range("A1:C3").Value = "My Range"

End Sub

VBA Selection Range Example 1-7

Now again run the code by clicking on the Play Button.

Result of Example 1-8

We will see the required text which we were in code value is got printed to the selected range.

Excel VBA Selection Range – Example #2

There is another way to implement VBA Selection Range. For this, follow the below steps:

Step 1: Write the subcategory of VBA Selection Range as shown below.

Code:

Sub Selection_Range3()

End Sub

VBA Selection Range Example 2-1

Step 2: By this process, we can select the range of any specific sheet which we want. We don’t need to make that sheet as current. Use Worksheet function to activate the sheet which wants by putting the name or sequence of the worksheet.

Code:

Sub Selection_Range3()

Worksheets("Sheet2").Activate

End Sub

Use Worksheet function

Step 3: Now again as per example-1, we will select the range of the cells which want to select. Here we are considering the same range from cell A1 to C3.

Code:

Sub Selection_Range3()

Worksheets("Sheet2").Activate
Range("A1:C3").Select

End Sub

VBA Selection Range Example 2-3
Step 4: Now run the code by clicking on the Play Button. We will see, the cells from A1 to C3 of the worksheet which is Name as Sheet2 are now selected.

VBA Selection Range Example 2-4

As we have already selected the cells which we wanted, so now we can again write the one line code by which we will insert any text to selected cells. Or we can select the new range of cells manually also to see the changes by this code.

Step 5: For this use Selection function along with Value and choose the value which we want to see. Here our value is the same as we used before as My Range.

Code:

Sub Selection_Range3()

Worksheets("Sheet2").Activate
Range("A1:C3").Select
Selection.Value = "My Range"

End Sub

Use Selection function

Step 6: Now again run the code by clicking on Play Button.

VBA Selection Range Example 2-6

We will see, the selected cells from A1 to C3 got the value as My Range and those cells are still selected.

Excel VBA Selection Range – Example #3

In this example, we will see how to move the cursor from a current cell to the far most end cell. This process of selecting the end cell of the table or blank worksheet is quite useful in changing the location from where we can select the range. In Excel, this process is done manually by Ctrl + any Arrow key. Follow the below steps to use VBA Selection Range.

Step 1: Write the subcategory of VBA Selection Range again.

Code:

Sub Selection_Range4()

End Sub

VBA Selection Range Example 3-1

Step 2: Choose the reference range cell from where we want to move the cursor. Let’s say that cell is B1.

Code:

Sub Selection_Range4()

Range("B1")

End Sub

VBA Selection Range Example 3-2

Step 3: Now to move to the End table or sheet towards right we will use xlToRight and for left it would be changed to xlToLeft as shown below.

Code:

Sub Selection_Range4()

Range("B1").End(xlToRight).Select

End Sub

VBA Selection Range Example 3-3

Step 4: Now run the code by pressing F5 key.

VBA Selection Range Example 3-4

We will see, our cursor from anywhere from the first row or cell B1 will move to the far end to the sheet.

In a similar way, we can move the cursor and select the cell of the far down or up location of any sheet by xlDown or xlUP. Below is the code for selecting the far down cell of a sheet from reference cell B1.

Code:

Sub Selection_Range4()

Range("B1").End(xlDown).Select

End Sub

VBA Selection Range Example 3-5

Pros of Excel VBA Selection Range

  • This is as easy as selecting the range of cells manually in Excel.
  • We can choose any type of range which we cannot do manually.
  • We can select and fill the cells which are only possible in excel by Find and Replace option.
  • Selecting the range cells and putting the data into that can be done simultaneously with one line of code.

Things to Remember

  • Using xlDown/Up and xlToLeft/Right command in code will take us to cells which is a far end or to the cell which has data. Means, the cell with the data will stop and prevent us from taking to the far end of the sheet.
  • We can choose any type of range but, make sure the range of cells is in sequence.
  • Random selection of cell is not allowed with these shown examples.
  • Always save the excel file as Macro Enable excel to prevent losing the code.

Recommended Articles

This is a guide to VBA Selection Range. Here we discuss how to select a range in Excel using VBA code along with practical examples and downloadable excel template. You can also go through our other suggested articles –

  1. VBA Conditional Formatting
  2. VBA Remove Duplicates
  3. Excel Named Range
  4. VBA XLUP

Выделения относительно активной ячейки

Выделить вниз до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Down)

        Sub CtrlShiftDown()
            Range(ActiveCell, ActiveCell.End(xlDown)).Select
        End Sub

Выделить вверх до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Up)

        Sub CtrlShiftUp()
            Range(ActiveCell, ActiveCell.End(xlUp)).Select
        End Sub

Выделить вправо до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Right)

        Sub CtrlShiftRight()
            Range(ActiveCell, ActiveCell.End(xlToRight)).Select
        End Sub

Выделить влево до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Left)

        Sub CtrlShiftLeft()
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
        End Sub

Выделить текущую область (выделяется диапазон неразрывно заполненных ячеек — равносильно нажатию кнопок Ctrl+Shift+*)

        Sub CtrlShiftUmn()
            ActiveCell.CurrentRegion.Select
        End Sub

Выделить активную область (происходит выделение всего заполненного диапазона Ctrl+Shift+Home, End, Home)

        Sub CtrlShiftHome()
            Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell)).Select
        End Sub

Выделить смежные (заполненные прилегающие к активной ячейке) ячейки в столбце с активной ячейкой

        Sub SelectActiveColumn()
            Dim TopCell As Range
            Dim BottomCell As Range
            If IsEmpty(ActiveCell) Then Exit Sub
            On Error Resume Next
            If IsEmpty(ActiveCell.Offset(-1, 0)) Then Set TopCell = _
            ActiveCell Else Set TopCell = ActiveCell.End(xlUp)
            If IsEmpty(ActiveCell.Offset(1, 0)) Then Set BottomCell = _
            ActiveCell Else Set BottomCell = ActiveCell.End(xlDown)
            Range(TopCell, BottomCell).Select
        End Sub

Выделить смежные ячейки в строке с активной ячейкой

        Sub SelectActiveRow()
            Dim LeftCell As Range
            Dim RightCell As Range
            If IsEmpty(ActiveCell) Then Exit Sub
            On Error Resume Next
            If IsEmpty(ActiveCell.Offset(0, -1)) Then Set LeftCell = _
            ActiveCell Else Set LeftCell = ActiveCell.End(xlToLeft)
            If IsEmpty(ActiveCell.Offset(0, 1)) Then Set RightCell = _
            ActiveCell Else Set RightCell = ActiveCell.End(xlToRight)
            Range(LeftCell, RightCell).Select
        End Sub

Выделить весь активный столбец

        Sub SelectionEntireColumn()
            Selection.EntireColumn.Select
        End Sub

Выделить всю активную строку

        Sub SelectEntireRow()
            Selection.EntireRow.Select
        End Sub

Выделить рабочий лист

        Sub SelectEntireSheet()
            Cells.Select
        End Sub

Выделить следующую пустую ячейку снизу

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

Выделить следующую пустую ячейку справа

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

Выделение от первой непустой до последней непустой ячеек в строке

        Sub SelectFirstToLastInRow()
            Dim LeftCell As Range
            Dim RightCell As Range
            Set LeftCell = Cells(ActiveCell.Row, 1)
            Set RightCell = Cells(ActiveCell.Row, 256)
            If IsEmpty(LeftCell) Then Set LeftCell = LeftCell.End(xlToRight)
            If IsEmpty(RightCell) Then Set RightCell = RightCell.End(xlToLeft)
            If LeftCell.Column = 256 And RightCell.Column = 1 Then ActiveCell. _
            Select Else Range(LeftCell, RightCell).Select
        End Sub

Выделение от первой непустой до последней непустой ячеек в столбце

        Sub SelectFirstToLastInColumn()
            Dim TopCell As Range
            Dim BottomCell As Range
            Set TopCell = Cells(1, ActiveCell.Column)
            Set BottomCell = Cells(16384, ActiveCell.Column)
            If IsEmpty(TopCell) Then Set TopCell = TopCell.End(xlDown)
            If IsEmpty(BottomCell) Then Set BottomCell = BottomCell.End(xlUp)
            If TopCell.Row = 16384 And BottomCell.Row = 1 Then ActiveCell. _
            Select Else Range(TopCell, BottomCell).Select
        End Sub
 

Петелин_Роман

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

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

#1

09.03.2017 09:54:39

Добрый день.
Прошу помочь с написанием макроса. Хочу сделать так, чтобы макрос сначала выделил определенную область и удалил ее. Затем в дальнейшем он выделит новую область и пронумерует ее. Макрос относится к первому листу приложенного файла. Заранее спасибо.

Код
 Sub Добавление_строк()
Application.ScreenUpdating = False
Dim i As Integer, k As Integer, rng As Range, j As Integer, rng1 As Range
j = Cells(1, 3).Value = Range("Количество_строк")
Set rng1 = Range("C3:F" & j) `[в этом месте макрос не срабатывает
rng1.Select
Selection.Delete
i = Range("Количество_строк")
If i = 0 Then
Range("Количество_строк").Select
Exit Sub
End If
Range("Количество_строк").Select
k = i + 2
If k < 3 Then
k = 3
End If
Range("Количество_строк").Select
Set rng = Range("C3:C" & k)`а вот здесь все нормально, выделяет изменяемую область
Rows("2").Select
     Selection.Copy
     Rows("3:" & k).Select
     Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    rng.Select
    Call Нумерация_строк
Range("Количество_строк").Select
           Application.ScreenUpdating = True
End Sub

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

  • Макросы.xlsm (36.45 КБ)

Изменено: Петелин_Роман09.03.2017 12:44:36

 

Пытливый

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

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

j = Cells(1, 3).Value = Range(«Количество_строк»)
Что должна делать эта инструкция? Cells(1,3) это С1 ячейка. Именованный диапазон «Количество_строк» это ячейка В1.
j=C1=B1????? что это значит?
Потом на переменную j идет ссылка в определении адреса другого диапазона

P.S. Точнее даже не так: что вы пытались сделать этой инструкцией, какая ее задача?

Изменено: Пытливый09.03.2017 10:09:43

Кому решение нужно — тот пример и рисует.

 

Цель сделать так, чтобы при вводе каждого нового числа в ячейку «Количество_строк», макрос автоматически удалял прежнюю таблицу, и создавал новую. То есть, макрос должен удалить количество строк, зависящее от предыдущего значения ячейки B1, и создать новую, отталкиваясь от нового значения. Я и не говорю, что это отличный способ. Пробовал сделать сам, опыта в VBA мало.

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#4

09.03.2017 10:15:31

Код
j = Val(Range("Количество_строк"))
if j > 0 then
Set rng1 = Range("C3:F" & j)
else
msgbox "В ячейке " & Range("Количество_строк").Address & " необходимо указать число!"
exit sub
end if

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Пытливый

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

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

#5

09.03.2017 10:18:38

Уберите в том месте ссылку на ячейку С1

Код
j = Range("Количество_строк")

это что сразу видно.  Зачем в коде 3 раза Range(«Количество_строк»).Select? Зачем нужно для выполнения задачи выделение этого диапазона? Если не нужно — удалите.

Изменено: Пытливый09.03.2017 10:21:20

Кому решение нужно — тот пример и рисует.

 

Этот способ не решает проблему, чтобы он стирал прежнюю таблицу, а потом рисовал новую, опираясь на данные одной и той же ячейки. Еще раз » макрос должен удалить количество строк, зависящее от предыдущего значения ячейки B1, и создать новую, отталкиваясь от нового значения».

 

Просьба всем. Есть вполне понятный вопрос —  макрос должен удалить количество строк, зависящее от предыдущего значения ячейки B1, и создать новую, отталкиваясь от нового значения. Я прекрасно понимаю, что там можно многое усовершенствовать и упростить. Но первоочередная задача все же одна. Про выделение одной и той же ячейки несколько раз в курсе, рудимент многократной переделки макроса, добавления новых задач. Я пытался сделать ячейку, которая дублирует старое значение B1. Оттого и ввел переменную j. Может затея кривая, но по-другому идей нет.

Изменено: Петелин_Роман09.03.2017 10:31:18

 

Пытливый

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

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

#8

09.03.2017 10:31:03

Код
Sub T_284()
    Dim lngI As Long
    If [c2].CurrentRegion.Rows.Count > 3 Then
        Range(Cells(3, 3), Cells([c2].CurrentRegion.Rows.Count, 6)).ClearContents
    End If
        lngI = 1
            Do
                Cells(lngI + 2, 3) = lngI
                lngI = lngI + 1
            Loop Until lngI > Range("Количество_строк")
End Sub

Кому решение нужно — тот пример и рисует.

 

Уточню один момент. Мне не понятно, по какой причине макрос не выдавал ошибку при указании этого диапазона Set rng = Range(«C3:C» & k), но стал ругаться, когда я ввел Set rng1 = Range(«C3:F» & j). Это же в обоих случаях просто указание диапазона, размер которого зависит от переменной. Которая выше объявлена и является предыдущим значением ячейки B1, до того, как в нее ввели новое число.

 

Пытливый

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

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

Видимо переменная j на момент использования ее в определении диапазона не содержит значения.

Кому решение нужно — тот пример и рисует.

 

Содержит. Для этого и указал, что она равна числовому значению ячейки B1.

 

Пытливый

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

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

#12

09.03.2017 10:51:02

Нет, вы указали что

Код
j = Cells(1, 3).Value = Range("Количество_строк")

т.е. для переменной с типом данных целое число вы указали, что она равна равенству ячейки С3 и именованного диапазона. А поскольку это равенство ложно — то в переменную записан 0 (числовое значение означающее ЛОЖЬ). А при попытке задать диапазон с адресом (С3:F0) вываливается ошибка.

Кому решение нужно — тот пример и рисует.

 

Хорошо, тогда как надо было сделать правильно? Сохранив этот же принцип. Понимаю, что эту задачу можно и по-другому решить, но хочется понять, как вот таким способом нужно правильно указать.

 

Юрий М

Модератор

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

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

#14

09.03.2017 10:55:01

Цитата
Петелин_Роман написал:
Содержит

А Вы остановите код в нужном месте, и посмотрите значение переменной j

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#15

09.03.2017 11:02:57

Цитата
Петелин_Роман написал:
тогда как надо было сделать правильно?

Я вроде выше в сообщении

#4

именно эту часть кода Вам и привел правильно, да с обработкой ошибок. Пробовать лень было? Или что не так?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Петелин_Роман

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

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

#16

09.03.2017 11:06:01

Цитата
The_Prist написал:
Пробовать лень было? Или что не так?

На личности не переходите, ок?

Цитата
Петелин_Роман написал:
Этот способ не решает проблему, чтобы он стирал прежнюю таблицу, а потом рисовал новую, опираясь на данные одной и той же ячейки. Еще раз » макрос должен удалить количество строк, зависящее от предыдущего значения ячейки B1, и создать новую, отталкиваясь от нового значения».

Если просто указать равенство с ячейкой B1, он сотрет только то количество строк, которое равно новому числу. Но не всю прежнюю таблицу. Это будет заметно, если новое число меньше старого.

 

Пытливый

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

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

Именно поэтому я предложил решение через очищение текущего диапазона (CurrentRegion).

p.s. а если вы упорно хотите использовать придуманный Вами алгоритм, то тогда надо на событие изменения ячейки В1 в конец кода вешать инструкцию, чтоб значение В1 дублировалось в еще какую ячейку (например, в С1).
Потом в коде на событие изменения вы очищаете диапазон, опираясь на значение в С1, формируете новый, опираясь на значение В1.

Изменено: Пытливый09.03.2017 11:45:00

Кому решение нужно — тот пример и рисует.

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#18

09.03.2017 11:45:10

Цитата
Петелин_Роман написал: На личности не переходите, ок?

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

Цитата
Петелин_Роман написал: тогда как надо было сделать правильно? Сохранив этот же принцип.

При этом не факт, что весь остальной код работает корректно, т.к. упор сделан именно на одну весьма ошибочную строку. Но не на код в целом.

Изменено: The_Prist09.03.2017 12:45:31

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Петелин_Роман

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

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

#19

09.03.2017 11:48:33

The_Prist,Присмотритесь к обсуждению, там уже указано, что такой способ не подходит.

Цитата
Петелин_Роман написал:
Если просто указать равенство с ячейкой B1, он сотрет только то количество строк, которое равно новому числу. Но не всю прежнюю таблицу. Это будет заметно, если новое число меньше старого.

Остальной код работает, спасибо за излишнюю заботу.
Пытливый, спасибо, попробую.

Изменено: Петелин_Роман09.03.2017 11:50:25

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#20

09.03.2017 11:54:12

Цитата
Петелин_Роман написал: Присмотритесь к обсуждению

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

Цитата
Петелин_Роман написал: макрос должен удалить количество строк, зависящее от предыдущего значения ячейки B1, и создать новую, отталкиваясь от нового значения

оставив это

Цитата
Петелин_Роман написал: Сохранив этот же принцип

Либо соглашайтесь, что надо все переписать, либо не советуйте присматриваться к своим противоречивым «хочухам».
Еще раз повторюсь: я показал где именно у Вас ошибка и как правильно. Что там дальше не так — не совсем укладывается в тему в принципе, т.к. изначально вопрос был не в «замене таблицы», а в ошибке выделения конкретного диапазона.

Изменено: The_Prist09.03.2017 12:45:57

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Гражданин, тут уже дали вполне толковый совет. Без вас обошлись. Следите за речью. Прежде чем давать совет, можно внимательно прочитать историю обсуждения. А не выскакивать с советом, полезность которого в рамках вопроса равна нулю. Остальное пишите в лс, если и дальше намерены отвечать в подобном ключе. Вас никто не обязывает давать советы и насильно не заставляет.

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#22

09.03.2017 12:00:52

Цитата
Петелин_Роман написал:
полезность которого в рамках вопроса равна нулю

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

Код
Sub Добавление_строк() ' Добавляет строки в таблицу
Application.ScreenUpdating = False
Dim i As Integer, k As Integer, rng As Range, j As Integer, rng1 As Range
    j = Val(Range("Количество_строк"))
    If j > 0 Then
    Set rng1 = Range("C3:F" & j)
    Else
    MsgBox "В ячейке " & Range("Количество_строк").Address & " необходимо указать число!"
    Exit Sub
    End If
rng1.Select
Selection.Delete
i = Range("Количество_строк")
If i = 0 Then
Range("Количество_строк").Select
Exit Sub
End If
Range("Количество_строк").Select
k = i + 2
If k < 3 Then
k = 3
End If
Range("Количество_строк").Select
Set rng = Range("C3:C" & k)
Rows("2").Select
     Selection.Copy
     Rows("3:" & k).Select
     Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    rng.Select
    Call Нумерация_строк
Range("Количество_строк").Select
           Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("Количество_строк")) Is Nothing Then
Application.EnableEvents = False
Call Добавление_строк
End If
Application.EnableEvents = True
End Sub
Sub Нумерация_строк()
i = 1
For Each icell In Selection
    If icell.Rows.Hidden = False Then
        icell.Value = i
        i = i + 1
    End If
Next
End Sub

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

Цитата
Петелин_Роман написал:
Вас никто не обязывает давать советы

здесь согласен. Больше в Ваши темы ни ногой. Гражданин. Удачи с таким подходом.

P.S. Не сильно меняя исходный код можно так было сделать. Всего две строки добавить к выше предложенным:

Код
Sub Добавление_строк() ' Добавляет строки в таблицу
Application.ScreenUpdating = False
Dim i As Long, k As Long, rng As Range, j As Long, rng1 As Range
    j = Val(Range("Количество_строк"))
    If j > 0 Then
    Set rng1 = Range("C3:F" & j)
    Else
    MsgBox "В ячейке " & Range("Количество_строк").Address & " необходимо указать число!"
    Exit Sub
    End If
'очищаем прежнее
i = Cells(Rows.Count, 3).End(xlUp).Row
Range(Cells(j + 3, 1), Cells(i, 1)).EntireRow.Delete
'--------------------------------------
rng1.Select

Selection.Delete
i = Range("Количество_строк")
If i = 0 Then
Range("Количество_строк").Select
Exit Sub
End If
Range("Количество_строк").Select
k = i + 2
If k < 3 Then
k = 3
End If
Range("Количество_строк").Select
Set rng = Range("C3:C" & k)
Rows("2").Select
     Selection.Copy
     Rows("3:" & k).Select
     Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    rng.Select
    Call Нумерация_строк
Range("Количество_строк").Select
           Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("Количество_строк")) Is Nothing Then
Application.EnableEvents = False
Call Добавление_строк
End If
Application.EnableEvents = True
End Sub
Sub Нумерация_строк()
i = 1
For Each icell In Selection
    If icell.Rows.Hidden = False Then
        icell.Value = i
        i = i + 1
    End If
Next
End Sub

Изменено: The_Prist09.03.2017 12:09:10

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

The_Prist, Оо, вы догадались до всего того, что уже успели выше обсудить. Здорово. Прогресс.

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#24

09.03.2017 12:19:37

Цитата
Петелин_Роман написал:
вы догадались до всего того, что уже успели выше обсудить. Здорово. Прогресс.

Да, представляете. Догадался. А догадаться как применить к своему коду должны были Вы, еще на пятом сообщении. Так что я, в отличие от Вас, хоть как-то прорессирую…

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

The_Prist,Это был сарказм. Еще раз — пишите в лс, хватит гадить в обсуждении. Все, о чем вы «догадались», было разобрано выше без вас, мегадогадливого человека.

Изменено: Петелин_Роман09.03.2017 12:25:22

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

Роман, хамить не надо. Это был не сарказм. Это был наезд, притом весьма неприкрытый. Притом в ответ на решение проблемы. Хотите не гадить в теме? Выдохните, перечитайте свои и мои сообщения и посмотрите внимательнее, кто здесь больше нагадил. И еще раз удачи с подобным подходом.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

The_Prist,Решения проблемы не было. И хамить начали вы. Прежде чем указывать, что вашим советом не воспользовались, убедитесь в этом еще раз. Совет был оценен и признан негодным для решения задачи в целом. Остальное пишите в лс, хватит гадить.

Изменено: Петелин_Роман09.03.2017 12:28:56

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

Да-да. Я уже понял. Простите, что влез в обсуждение. Удачи еще раз.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 
 

vikttur

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

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

#30

09.03.2017 12:47:19

Петелин_Роман, своими ответами Вы уже настроили большую часть постоянных посетителей форума против себя.

Работа с выделениями

Работа с выделениями

Прежде чем изменить значение или формат ячейки или нескольких ячеек, пользователь должен их выделить. Однако в VBA выделение ячеек не требуется, так как для идентификации ячеек, над которыми должны проводиться определенные действия, можно использовать объекты Range. Но в VBA есть инструменты, связанные с выделением; они используются для реализации двух возможностей — код способен определить, какие ячейки выделены пользователем, и код может показать пользователю место на рабочем листе, где происходит что-то важное.

Во многих случаях пользовательский код должен воздействовать на выбранные ячейки, как это делают встроенные команды Excel. Для доступа к выделенному пользователем диапазону используется свойство Selection (Выделение) объекта Application или Window. Свойство Selection объекта Application возвращает диапазон, выделенный на рабочем листе, активном в данный момент. Следующие два оператора идентичны:

Application.Selection.Value = 20

Selection.Value =2 0

Для того чтобы удостовериться в том, что ссылка всегда относится к определенному окну, независимо оттого, какое окно активно в текущий момент, необходимо использовать свойство окна Selection. В следующем примере продемонстрирована данная техника; также здесь показано, как установить объектную ссылку на диапазон, представляющий текущее выделение для повторного использования того же диапазона в дальнейшем:

Dim Sel Range As Range

Set SelRange = Windows(«Инвентаризация игрушек.xls»>.Selection

With SelRange

.CheckSpelling

.AutoFit

.Copy

End With

Когда VBA-программа вносит изменения в рабочий лист и необходимо, чтобы пользователь их заметил, следует воспользоваться методом Select (Выделить) для перемещения выделения на нужный диапазон, диаграмму или что-либо другое. Метод Select можно применять фактически к любому существующему в Excel объекту, в том числе к объектам Chart (Диаграмма) и всем их компонентам (каждая часть диаграммы является отдельным VBA-объектом). к объектам Shape (Форма) и, конечно же, к объектам Range.

Для выделения диапазона необходимо сначала активизировать рабочий лист, на котором диапазон находится, а затем использовать метод Select для объекта Range, как показано в данном примере:

With Worksheets(» «)

.Activate .Range(«Разбитые сердца»).Select

End With

Кстати, метод Select для объектов Worksheet, очевидно, не выполняет ничего, кроме активизации указанного рабочего листа, и не изменяет в нем существующее выделение. Другими словами, он эквивалентен методу рабочего листа Activate. Подобным образом методы Activate и Select можно использовать для активизации листа диаграммы, но ни один из методов в действительности не выделяет диаграмму. Вот пример;

Chart s(«Места жительства клиентов»).Select

Для того чтобы выделить компонент диаграммы или внедренную диаграмму, используйте метод Select для интересующего вас объекта.

Чтобы сделать ячейку активной для ввода, к данной ячейке используется метод Activate (Активизировать) объекта Range. Если активизированная ячейка находится в пределах текущего выделения, весь диапазон остается выделенным. Именно таким образом работает следующий пример:

Worksheets(«НичегоНеДелайДоМоегоУказания»).Activate

Range(«A1:E7»).Select Range(«C4»).Activate

Если активизированная ячейка находится за пределами выделения, оно перемещается на активизированную ячейку.

Код для работы с выделенными ячейками, вероятно, приведет к возникновению ошибки, если его применить к диаграмме. Вот почему, прежде чем выполнять какие-либо операции с выделением, обычно следует убедиться, что выделение содержит тот тип объектов, который ожидается в коде. VBA-функция TypeName возвращает строку, содержащую тип объекта

выделения. С помощью структур If. . .Then или Case. . .Select можно определить, какое из возможных действий проводить над выделенным объектом.

В приведенном ниже примере выражение TypeName ( Selection) в операторе Select (вторая строка кода) возвращает строку, содержащую тип объекта текущего выделения. Данная строка затем проверяется рядом операторов Case, является ли выделение диапазоном (в таком случае его значение устанавливается равным 2 001), областью диаграммы (в таком случае устанавливается красный цвет выделения), когда же выделение не сделано, пользователь видит сообщение об отсутствии выделения. Также предусмотрен вывод соответствующего сообщения для случая, когда выделение не принадлежит ни одному из перечисленных типов:

With Selection

Select Case TypeName(Selection)

Case «Range»

.Value = 2001

Case «ChartArea»

.Interior.Colorlndex = 3 ‘ 3 = bright red

Case «Nothing»

MsgBox «Ничего не выделенно»

Case Else

MsgBox «Невозможно определить тип выделения!»

End Select

End With

Читайте также

Работа не волк. Работа – вервольф

Работа не волк. Работа – вервольф
Недаром твердят, что SEO – это индустрия. Тяжелая или легкая промышленность? Скорее нелегкая. Зато рабочих мест она порождает порядочное количество – от горняка в линк — менеджерском забое до конторского инженера в обличии высоколобого

1.3.3 Лабораторная работа #3 «Работа с внешними устройствами»

1.3.3 Лабораторная работа #3 «Работа с внешними устройствами»
1. Используя функции XKeysymToString() и XKeycodeToKeysym(), напишите программу, которая реагирует на нажатие клавиш в окне выдачей в него кода символа, состояния модификаторов и символьной расшифровки нажатой клавиши.

2. Напишите

Практическая работа 5. Работа с фрагментами текста

Практическая работа 5. Работа с фрагментами текста
Задание. Создать текстовый документ и переставить местами его отдельные фрагменты. Вставить в текстовый документ результаты вычислений в Калькуляторе.Последовательность выполнения1. Запустите Блокнот и создайте

Практическая работа 8. Работа с меню Пуск

Практическая работа 8. Работа с меню Пуск
Задание. Настроить значки меню Пуск.Последовательность выполнения1. Запустите программу Блокнот с помощью строки поиска в меню Пуск.2. Запустите программу Калькулятор с помощью строки поиска, не пользуясь мышью. Для этого:1)

Практическая работа 12. Работа с окнами папок

Практическая работа 12. Работа с окнами папок
Задание. Изучить работу с окнами папок. Научиться перемещаться по файлам и папкам.Последовательность выполнения1. С помощью меню Пуск откройте папку Компьютер. Ознакомьтесь с содержимым окна, покажите его составляющие.2. С

Практическая работа 14. Работа с файлами и папками

Практическая работа 14. Работа с файлами и папками
Задание. Научиться создавать папки, копировать, перемещать, переименовывать и удалять файлы.Последовательность выполнения1. Откройте с помощью меню Пуск папку Документы.2. В папке Документы создайте новую папку с именем

Практическая работа 15. Работа с изображениями в Проводнике

Практическая работа 15. Работа с изображениями в Проводнике
Задание. Просмотреть и отредактировать изображения с помощью встроенных средств Windows Vista.Последовательность выполнения1. Откройте папку, содержащую цифровые изображения. Это может быть папка с вашими

Практическая работа 16. Работа со сменными носителями

Практическая работа 16. Работа со сменными носителями
Задание 1. Скопировать файлы и папки на flash-диск.Последовательность выполнения1. Подключите к компьютеру устройство flash-памяти. При этом обратите внимание на размещение выступов на разъеме и самом устройстве, чтобы

Практическая работа 19. Поиск в Интернете. Работа с папками Избранное и Журнал

Практическая работа 19. Поиск в Интернете. Работа с папками Избранное и Журнал
Задание 1. Научиться выполнять поиск в Интернете, настраивать параметры поиска, работать с папками Избранное и Журнал.Последовательность выполнения1. Запустите Internet Explorer.2. Щелкните кнопкой мыши

Практическая работа 24. Работа с программой Dr.Web

Практическая работа 24. Работа с программой Dr.Web
Задание. Изучить приемы работы с программой Dr.Web.Для выполнения этой работы на компьютере должен быть установлен антивирус Dr.Web. При отсутствии какой-либо антивирусной программы на вашем компьютере вы можете установить Dr.Web

Практическая работа 26. Работа с файловым менеджером

Практическая работа 26. Работа с файловым менеджером
Задание 1. Установить и настроить программу Total Commander.Последовательность выполнения1. Загрузите последнюю версию Total Commander с сайта wincmd.ru.2. Запустите загруженный файл и установите программу, ответив на несколько простых

Практическая работа 27. Работа с проигрывателем Windows Media

Практическая работа 27. Работа с проигрывателем Windows Media
Задание 1. Изучить средства управления воспроизведением проигрывателя Windows Media.Последовательность выполнения1. Откройте для воспроизведения с помощью проигрывателя любой музыкальный файл, например из папки

Практическая работа 30. Редактирование документа. Работа с фрагментами.

Практическая работа 30. Редактирование документа. Работа с фрагментами.
Задание. Отредактировать сохраненный документ.Последовательность выполнения1. Откройте ранее сохраненный документ Урок 1 любым способом.2. Выделите слово, предложение, строку, абзац, весь документ.

Практическая работа 53. Запуск Access. Работа с объектами базы данных

Практическая работа 53. Запуск Access. Работа с объектами базы данных
Задание. Ознакомиться с окном программы Access. Запустить и рассмотреть учебную базу данных.
ВНИМАНИЕ
При выполнении задания помните, что все внесенные в базу данных изменения записываются немедленно и их

Практическая работа 61. Работа с оборудованием

Практическая работа 61. Работа с оборудованием
Задание. Проверить параметры и работу установленного оборудования и выполнить проверку жесткого диска.Последовательность выполнения1. Щелкните правой кнопкой мыши на значке Компьютер и выберите пункт Свойства. В

Понравилась статья? Поделить с друзьями:
  • Vba excel выделение всего столбца
  • Vba excel выгрузка массива на лист
  • Vba excel вывод сообщения да нет
  • Vba excel вывод массивы
  • Vba excel вывод значения в ячейку