Здравствуйте, специалисты по VBA. Помогите изменить код.
Суть такая. На листе по-умолчанию - есть определенное количество линий, названия которых записаны в строке 9. И я пытаюсь расставить по серединам этих линий - квадраты, названия которых - записаны (каждый под соответствующей линией) в строке 15. Но не получается. приходится каждую фигуру, прописывать в макросе по имени. Но это не подходит, поскольку названия в строках 9 и 15 - постоянно меняются.
Как макросом - расставить по серединам линий - те квадраты, номера которых записаны в строке 15, без прописывания в коде - названия каждого из них ?
Макрос сейчас весьма примитивен и выглядит вот так:
[vba]
Код
Sub Линия() On Error Resume Next Dim Линия, Круг As Object Set Линия = ActiveSheet.Shapes("Овал 1|Овал 4") Set Круг = ActiveSheet.Shapes("Ф-Овал 1|Овал 4") Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End Sub
Sub Линия2() On Error Resume Next Dim Линия, Круг As Object Set Линия = ActiveSheet.Shapes("Овал 4|Овал 3") Set Круг = ActiveSheet.Shapes("Ф-Овал 4|Овал 3") Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End Sub
Sub Линия3() On Error Resume Next Dim Линия, Круг As Object Set Линия = ActiveSheet.Shapes("Овал 1|Овал 5") Set Круг = ActiveSheet.Shapes("Ф-Овал 1|Овал 5") Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End Sub
Sub Макрос1() Линия Линия2 Линия3 End Sub
[/vba]
Здравствуйте, специалисты по VBA. Помогите изменить код.
Суть такая. На листе по-умолчанию - есть определенное количество линий, названия которых записаны в строке 9. И я пытаюсь расставить по серединам этих линий - квадраты, названия которых - записаны (каждый под соответствующей линией) в строке 15. Но не получается. приходится каждую фигуру, прописывать в макросе по имени. Но это не подходит, поскольку названия в строках 9 и 15 - постоянно меняются.
Как макросом - расставить по серединам линий - те квадраты, номера которых записаны в строке 15, без прописывания в коде - названия каждого из них ?
Макрос сейчас весьма примитивен и выглядит вот так:
[vba]
Код
Sub Линия() On Error Resume Next Dim Линия, Круг As Object Set Линия = ActiveSheet.Shapes("Овал 1|Овал 4") Set Круг = ActiveSheet.Shapes("Ф-Овал 1|Овал 4") Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End Sub
Sub Линия2() On Error Resume Next Dim Линия, Круг As Object Set Линия = ActiveSheet.Shapes("Овал 4|Овал 3") Set Круг = ActiveSheet.Shapes("Ф-Овал 4|Овал 3") Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End Sub
Sub Линия3() On Error Resume Next Dim Линия, Круг As Object Set Линия = ActiveSheet.Shapes("Овал 1|Овал 5") Set Круг = ActiveSheet.Shapes("Ф-Овал 1|Овал 5") Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End Sub
КошкаСофи, там нарисовали линию, и сразу нужно нарисовать квадрат, не переместить ранее нарисованный, а нарисовать новый и вписать туда значение. в идеале лучше сразу сгруппировать его с линией.
КошкаСофи, там нарисовали линию, и сразу нужно нарисовать квадрат, не переместить ранее нарисованный, а нарисовать новый и вписать туда значение. в идеале лучше сразу сгруппировать его с линией.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Sub Макрос1() Dim Линия As Shape, Круг As Shape, f, square_, line_, sh For f = 3 To 12 line_ = ThisWorkbook.Sheets(3).Cells(9, f).Value square_ = ThisWorkbook.Sheets(3).Cells(15, f).Value If line_ <> "" And square_ <> "" Then For Each sh In ThisWorkbook.Sheets(3).Shapes If sh.Name = line_ Then Set Линия = sh If sh.Name = square_ Then Set Круг = sh Next sh If IsEmpty(Линия) Then MsgBox "нет линии - " & line_: Exit Sub If IsEmpty(Круг) Then MsgBox "нет квадрата - " & square_: Exit Sub Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End If Next f Set Линия = Nothing Set Круг = Nothing End Sub
[/vba]
так?
[vba]
Код
Sub Макрос1() Dim Линия As Shape, Круг As Shape, f, square_, line_, sh For f = 3 To 12 line_ = ThisWorkbook.Sheets(3).Cells(9, f).Value square_ = ThisWorkbook.Sheets(3).Cells(15, f).Value If line_ <> "" And square_ <> "" Then For Each sh In ThisWorkbook.Sheets(3).Shapes If sh.Name = line_ Then Set Линия = sh If sh.Name = square_ Then Set Круг = sh Next sh If IsEmpty(Линия) Then MsgBox "нет линии - " & line_: Exit Sub If IsEmpty(Круг) Then MsgBox "нет квадрата - " & square_: Exit Sub Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End If Next f Set Линия = Nothing Set Круг = Nothing End Sub
Квадраты на листе - изначально отсутствуют. Им нужно сперва появиться на листе, затем расставиться по серединам линий.
в задании исходно был другой текст. проверку по наличию исправил, но как у вас квадраты рисуются?
[vba]
Код
Sub Макрос1() Dim Линия As Shape, Круг As Shape, f, square_, line_, sh, l, k For f = 3 To 12 line_ = ThisWorkbook.Sheets(3).Cells(9, f).Value square_ = ThisWorkbook.Sheets(3).Cells(15, f).Value If line_ <> "" And square_ <> "" Then For Each sh In ThisWorkbook.Sheets(3).Shapes If sh.Name = line_ Then Set Линия = sh: l = True If sh.Name = square_ Then Set Круг = sh: k = True Next sh If Not l Then MsgBox "нет линии - " & line_: Exit Sub If Not k Then MsgBox "нет квадрата - " & square_: Exit Sub Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End If Next f Set Линия = Nothing Set Круг = Nothing End Sub
Квадраты на листе - изначально отсутствуют. Им нужно сперва появиться на листе, затем расставиться по серединам линий.
в задании исходно был другой текст. проверку по наличию исправил, но как у вас квадраты рисуются?
[vba]
Код
Sub Макрос1() Dim Линия As Shape, Круг As Shape, f, square_, line_, sh, l, k For f = 3 To 12 line_ = ThisWorkbook.Sheets(3).Cells(9, f).Value square_ = ThisWorkbook.Sheets(3).Cells(15, f).Value If line_ <> "" And square_ <> "" Then For Each sh In ThisWorkbook.Sheets(3).Shapes If sh.Name = line_ Then Set Линия = sh: l = True If sh.Name = square_ Then Set Круг = sh: k = True Next sh If Not l Then MsgBox "нет линии - " & line_: Exit Sub If Not k Then MsgBox "нет квадрата - " & square_: Exit Sub Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End If Next f Set Линия = Nothing Set Круг = Nothing End Sub
Sub чтотокакто() Dim Линия As Shape, Круг As Shape, f, line_, sh, l, k For f = 3 To 12 line_ = ThisWorkbook.Sheets(3).Cells(9, f).Value If line_ <> "" And ThisWorkbook.Sheets(3).Cells(15, f).Value <> "" Then Set Круг = квадрат(ThisWorkbook.Sheets(3).Cells(16, f).Interior.Color, ThisWorkbook.Sheets(3).Cells(15, f).Value, ThisWorkbook.Sheets(3).Cells(18, f).Value & vbCrLf & ThisWorkbook.Sheets(3).Cells(19, f).Value) For Each sh In ThisWorkbook.Sheets(3).Shapes If sh.Name = line_ Then Set Линия = sh: l = True Next sh If Not l Then MsgBox "нет линии - " & line_: Exit Sub Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End If Next f Set Линия = Nothing Set Круг = Nothing End Sub Function квадрат(цвет, имя, текст) Set квадрат = ThisWorkbook.Sheets(3).Shapes.AddShape(msoShapeRectangle, 300, 300, 40, 40) квадрат.Fill.ForeColor.RGB = цвет квадрат.TextFrame2.TextRange.Characters.Text = текст квадрат.Name = имя End Function
[/vba]
так?
[vba]
Код
Sub чтотокакто() Dim Линия As Shape, Круг As Shape, f, line_, sh, l, k For f = 3 To 12 line_ = ThisWorkbook.Sheets(3).Cells(9, f).Value If line_ <> "" And ThisWorkbook.Sheets(3).Cells(15, f).Value <> "" Then Set Круг = квадрат(ThisWorkbook.Sheets(3).Cells(16, f).Interior.Color, ThisWorkbook.Sheets(3).Cells(15, f).Value, ThisWorkbook.Sheets(3).Cells(18, f).Value & vbCrLf & ThisWorkbook.Sheets(3).Cells(19, f).Value) For Each sh In ThisWorkbook.Sheets(3).Shapes If sh.Name = line_ Then Set Линия = sh: l = True Next sh If Not l Then MsgBox "нет линии - " & line_: Exit Sub Круг.Left = Линия.Width / 2 + Линия.Left - Круг.Width / 2 Круг.Top = Линия.Height / 2 + Линия.Top - Круг.Height / 2 End If Next f Set Линия = Nothing Set Круг = Nothing End Sub Function квадрат(цвет, имя, текст) Set квадрат = ThisWorkbook.Sheets(3).Shapes.AddShape(msoShapeRectangle, 300, 300, 40, 40) квадрат.Fill.ForeColor.RGB = цвет квадрат.TextFrame2.TextRange.Characters.Text = текст квадрат.Name = имя End Function