Vba определить координаты ячейки excel

На мой взгляд, если рисовать между ячейками линию с помощью  

  ActiveSheet.Shapes.AddLine(x1, y1, x2, y2).Select  

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

  Что такое координаты ячейки? На мой взгляд это какое-то вымышленное понятие, ведь в Excel они не задаются линейными размерами, например милиметрами, дюймами, points, pixel и т.п.  
Например, высота строки измеряется в линейных размерах, т.е. points (pt),  
а вот ширина столбца измеряется средним количеством знаков от 0 до 9 для установленного по умолчанию стандартного шрифта( например Arial 10). И это вносит свои сложности.  
Вот приведу, как я нарисовал рамку с помощью метода границ (недостаток, что код громоздким получается)  
Sub Рамка()  
   Range(«B1:AH61»).Select  
   With Selection.Borders(xlEdgeLeft)  
       .LineStyle = xlContinuous  
       .Weight = xlMedium  
       .ColorIndex = xlAutomatic  
   End With  
   With Selection.Borders(xlEdgeTop)  
       .LineStyle = xlContinuous  
       .Weight = xlMedium  
       .ColorIndex = xlAutomatic  
   End With  
   With Selection.Borders(xlEdgeBottom)  
       .LineStyle = xlContinuous  
       .Weight = xlMedium  
       .ColorIndex = xlAutomatic  
   End With  
   With Selection.Borders(xlEdgeRight)  
       .LineStyle = xlContinuous  
       .Weight = xlMedium  
       .ColorIndex = xlAutomatic  
   End With  
End Sub  

  Конечно рамку можно нарисовать с помощью ActiveSheet.Shapes.AddLine(x1, y1, x2, y2).Select или BuildFreeform  и код будет короче выглядеть,    
но если рисовать линию между ячейками границами будет выглядеть логичнее.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Option Explicit
Sub PictureToCell(Nstrok As Long, Nstolb As Integer, _
ByVal name_of_Sheet As String, ByVal name_of_File As String)
''Накладывает' рисунок из файла 'name_of_File' на центр ячейки Cells(Nstrok, Nstolb)
 
Dim i As Long, j As Integer
Dim X As Double, Y As Double, CellsHeight As Double, CellsWidth As Double
 
With ThisWorkbook.Sheets(name_of_Sheet)
    '________________________________________________
    'Проверка, явлеется ли ячейка частью объединённой
    If .Cells(Nstrok, Nstolb).MergeCells = True Then
    '________________________________________________
        Dim strTmp As String, strTmp1 As String, Nstrok1 As String, _
Nstolb1 As String
        '________________________________________________________________________
        'Определение границ объединённой ячейки (номеров строк и столбцов)
        strTmp = .Cells(Nstrok, Nstolb).MergeArea.Address(ReferenceStyle:=xlR1C1)
        strTmp1 = Mid(strTmp, 2, InStr(1, strTmp, ':') - 2)
        Nstrok = Left(strTmp1, InStr(1, strTmp1, 'C') - 1)
        Nstolb = Right(strTmp1, Len(strTmp1) - InStr(1, strTmp1, 'C'))
        Nstrok1 = Right(strTmp, Len(strTmp) - InStr(1, strTmp, ':') - 1)
        Nstrok1 = Left(Nstrok1, InStr(1, Nstrok1, 'C') - 1)
        Nstolb1 = Right(strTmp, Len(strTmp) - InStr(1, strTmp, ':'))
        Nstolb1 = Right(Nstolb1, Len(Nstolb1) - InStr(1, Nstolb1, 'C'))
        '_________________________________________________________________________
        
        '______________________________________________
        'Определение размера объединённой ячейки
        For i = Nstrok To Nstrok1
            CellsHeight = CellsHeight + .Rows(i).Height
        Next i
        For j = Nstolb To Nstolb1
            CellsWidth = CellsWidth + .Columns(j).Width
        Next j
        '_______________________________________________
    Else
        CellsWidth = .Columns(Nstolb).Width
        CellsHeight = .Rows(Nstrok).Height
    End If
    '_________________________________________________
    'Определение координат верхнего левого угла ячейки
    For i = 1 To Nstrok - 1
       Y = Y + .Rows(i).Height
    Next i
    For j = 1 To Nstolb - 1
       X = X + .Columns(j).Width
    Next j
    '_________________________________________________
    '_________________________________________________________________________
    'Добавление на лист рисунка из файла без изменения размеров последнего
    Dim objPic As Shape
    Set objPic = .Shapes.AddPicture(name_of_File, True, True, X, Y, True, True)
    '_________________________________________________________________________
End With
'__________________________________________________
'Выделение картинки и её перемещение в центр ячейки
objPic.Select
With Selection
    .ShapeRange.IncrementLeft (CellsWidth - .Width) / 2
    .ShapeRange.IncrementTop (CellsHeight - .Height) / 2
End With
'__________________________________________________
End Sub

Как определить адрес активной ячейки.

Q: Как в макросе узнать и использовать текущее положение курсора (не мышиного, естественно)?

A:Очень просто! :-) ActiveCell.Row и ActiveCell.Column — покажут координаты активной ячейки.

[ Назад ]
[ Оглавление ]
[ Далее ]

Оставить комментарий

Комментарий:

можно использовать BB-коды

Максимальная длина комментария — 4000 символов.

 

Комментарии

1.

Мне нравитсяМне не нравится

17 апреля 2013, 22:49:22

Спасибо, освежило память))

2.

64K

28 сентября 2010 года

Vladlen70

0 / / 28.09.2010

Мне нравитсяМне не нравится

28 сентября 2010, 16:25:13

А не проще ли использовать — ActiveCell.Address или Activecell.AddressLocal?

Определение активных составляющих книги

Мне кажется, многие загонялись таким вопросом, как определить активную ячейку (на которой находится курсор), строку или столбец. Или же хотелось получить адрес в формате А1, В4 и т.д. Вот сегодня я и покажу, как это сделать, потому, что очень удобно, когда ты знаешь активные элементы книги.

Номер активной строки

Практически все активные элементы определяются при помощи такого слова — Active, кторое записывается перед определением активного элемента. Таким образом, номер активной строки можно вычислить следующим образом:

       Sub Stroka()

           s = ActiveCell.Row

           MsgBox «Активная строка под номером » & s, vbInformation, «Активная строка»

       End Sub

Номер активного столбца и стороки

Аналогично определению строки столбец определяется по такому же принципу, только в конце добавляется не строка, а столбец:

       Sub Stroka()

           s = ActiveCell.Row

           b = ActiveCell.Column

           MsgBox «Активная строка под номером » & s & » » & _

vbNewLine & «Активный столбец под номером » & b, vbInformation, «адрес»

       End Sub

Определяем номер последней заполненной строки и столбца

Sub Last_Stroka_and_Stolbec()

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

    Stroka = ActiveSheet.Cells.Find(What:=»*», SearchDirection:=xlPrevious, _

          SearchOrder:=xlByRows).Row

    Stolbec = ActiveSheet.Cells.Find(What:=»*», SearchDirection:=xlPrevious,         _SearchOrder:=xlByRows).Column

MsgBox «Последняя строка под номером » & Stroka & » » & _

           vbNewLine & «Последний столбец под номером » _

           & Stolbec, vbInformation, «Адрес»

End Sub

Определяем активную ячейку

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

      Sub yacheika()

          sk = ActiveCell.Row

          st = ActiveCell.Column

          MsgBox «Активная ячейка имеет координаты Cells(» & sk & «,» & st & «)», _

                  vbInformation, «Активная ячейка»

      End Sub

Адрес активной ячейки

Многие думали, а как получить адрес активной ячейки? Очень просто, делается это так:

      Sub adres()

          A = ActiveCell.Address

          MsgBox «Абсолютный адрес активной ячейки — » & A, vbInformation, «Адрес»

      End Sub

Но такая запись может не устроить некоторых, потому что вней присутствуют $, т.е. абсолютное значение, а не относительное. Но и это можно поправить. Доллары уберутся, если записать код так:

      Sub adress()

          A = ActiveCell.Address(0, 0)

          MsgBox «Относительный адрес активной ячейки — » & A, vbInformation, «Адрес»

      End Sub

В скобках оператора Address указано какое именно значение должно быть относительным, а какое абсолютным. Если Address(0,0), то и строка и столбец записаны относительными (первый ноль отвечает за строку, второй ноль — это столбец). Если в строке поставить вместо ноля еденицу, то строка будет абсолютным значением, а столбец относительным. Причём значения следующих записей равнозначны:

Address(1, 0) = Address(True, False)

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

Адрес выделенного диапазона можно получить следующим образом

      Sub diapazon()

‘используйте любую переменную для определения адреса

          A = Selection.Rows.Address(0, 0)    ‘Через строку

          b = Selection.Columns.Address(0, 0) ‘Через столбец

          c = Selection.Address(0, 0)

          MsgBox «Выделенный диапазон — » & A, vbInformation, «Адрес»

      End Sub

Координаты выделенного диапазона

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

      Sub Kdiapazon()

          a = Selection.Row

          b = Selection.Column

          K1 = Cells(a, b).Address(0, 0)

          aa = a + Selection.Rows.Count — 1

          bb = b + Selection.Columns.Count — 1

          K2 = Cells(aa, bb).Address(0, 0)

          MsgBox «Первая координата выделенного диапазона — » & K1 & vbNewLine & _

          «Вторая координата выделенного диапазона — » & K2, vbInformation, «Координаты»

      End Sub

a — Определяет номер первой строки выделенного диапазона;
b — Определяет номер первого столбца выделенного диапазона;
K1 — Определяем первую координату выделенного диапазона;
aa — Определяем номер последней строки выделенного диапазона;
bb — Определяем номер пследнего столбца выделенного диапазона;
K2 — Определяем вторую координату выделенного диапазона;

Selection.Rows.Count — определяет количество строк в выделенном диапазоне;
Selection.Columns.Count — определяет количество столбцов в выделенном диапазоне;

У многих возник вопрос: А почему вычитаем единицу? Всё потому, что первая координата входит в выделенный диапазон и нам её надо не потерять.

Имя активной книги

Имя активной книги возможно вычислить такой записью:

      Sub WorkbookName()

          Name = ActiveWorkbook.Name

          MsgBox «Имя активной книги — » & Name, vbInformation, «Имя активной книги»

      End Sub

Имя активного листа

Имя активного листа можно определить так:

      Sub SheetsName()

          Name = ActiveSheet.Name

          MsgBox «Имя активного листа — » & Name, vbInformation, «Имя активного листа»

      End Sub

Return to VBA Code Examples

This tutorial will demonstrate how to get a cell’s address.

Get Range Address

This will display the cell address using the Range object:

MsgBox Range("A1").Address

vba range cell address

Get Cells Address

This will display the cell address using the Cells object:

MsgBox Cells(1,1).Address

ActiveCell Address

To get the ActiveCell address use this code:

MsgBox ActiveCell.Address

Set Variable to Cell Address

You can also assign the cell address to a string variable for easy use within your code:

Dim strAddress As String
strAddress = Range("A1").Address

MsgBox strAddress

Get Row Number From Cell Address

This code will extract the row number from an address:

Sub GetRowNumberFromCellAddress()
Dim strAddress As String
Dim rownum As Long

strAddress = Range("A1:a10").Address

rownum = Range(strAddress).Row

MsgBox rownum

End Sub

However, usually you can use this much simpler code:

MsgBox Range("A1").Row

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

Like this post? Please share to your friends:
  • Vba определить другой excel
  • Vba объединить документы word в один
  • Vba объединение файлов word
  • Vba обращение к файлу excel
  • Vba обработка файлов excel