На мой взгляд, если рисовать между ячейками линию с помощью
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
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!
Learn More!