Здравейте, успях да направя макрос.
1. Маркира се областта за копиране
2. Стартира се макроса
3. Когато се появи диалоговия прозорец за въвеждане на първата клетка от областта за пействане се маркира клетка (може и да се напише нейния адрес).
Клетката може да е в същия или друг лист, също така и в друга работна книга.
За пействане в друга работна книга с Excel 2010 особеното е, че тя трябва да се активира през меню View -> Window -> Switch Windows. В Excel 2013 този проблем липсва.
4. Натиска се бутон ОК или клавиш Enter и готово.
- Ако има данни в клетки от областта за пействане се показва съобщение с опция за продължаване или спиране. Избира се желаната опция. Натискане на Enter означава продължаване.
- Ако се маркира повече от една клетка за начало на пействането - съобщение с опция за нов опит. Натискане на Enter означава нов опит.
- При грешка по време на процедурата: съобщение с изброена една вероятна причина - маркирана диаграма.
Sub PasteTransposeLink()
'Копира маркирана предварително област и я пейства
'в избрана от потребителя област
'едновременно като transpose и paste link.
'Excel 2010 - За да се пейстне в работна книга, различна от
'източника, тя трябва да се активира от меню
'View -> Switch Windows (когато се появи прозореца за избор на клетка).
On Error GoTo errorHandling
Dim myRange As Range, myCell As Range
Dim ExtSt As String, Msg As String
Dim NRows As Long, NCol As Long, i As Long, j As Long
Dim Ans As Variant
Dim Counter As Long
'Запомня маркираната преди стартирането на макроса област
Set myRange = Selection
NRows = Selection.Rows.Count
NCol = Selection.Columns.Count
'Ще се върне тук ако е избрана повече от една клетка
'за започване на пействането и е натиснат бутон Yes
'Показва се прозорец, в който да се маркира или напише
'първата клетка от областта, в която ще се пейства
TryAgain:
On Error Resume Next
Set myCell = Application.InputBox _
(Prompt:=vbNewLine & "Въведете адреса или маркирайте първата клетка" _
& " от областта за поставяне." & vbNewLine & vbNewLine, _
Type:=8)
On Error GoTo errorHandling
'Ако се натисне бутон Cancel - изход от процедурата
If myCell Is Nothing Then Exit Sub
'Ако се маркира повече от една клетка - съобщение с опция за нов опит
If myCell.Cells.Count > 1 Then GoTo MultipleEntry
'Активира маркираната клетка
With myCell
.Parent.Parent.Activate
.Parent.Activate
.Activate
End With
'Маркира областта за пействане
Range(myCell, myCell.Offset(NCol - 1, NRows - 1)).Select
'Ако има дори една клетка с данни в областта за пействане
'се показва съобщение с опция за отказ от пействането
Counter = WorksheetFunction.CountA(Selection.Cells)
If Counter > 0 Then
Msg = "В областта за пействане има клетки, " & vbNewLine
Msg = Msg & "които не са празни!" & vbNewLine & vbNewLine
Msg = Msg & "Данните ще бъдат заместени." & vbNewLine & vbNewLine & vbNewLine
Msg = Msg & "Желаете ли да продължите?"
Ans = MsgBox(Msg, vbYesNo + vbExclamation)
If Ans = vbNo Then Exit Sub
End If
'Проверява дали данните ще се пействат в лист с различно име.
'Това ще определи дали в линковете ще се включват имената на листа и на файла
If myCell.Parent.Name = myRange.Parent.Name Then
ExtSt = "False"
Else: ExtSt = "True"
End If
'Зададено е линковете да са с относителни адреси. За абсолютни
'или смесени False се променя на True
For i = 1 To myRange.Rows.Count
For j = 1 To myRange.Columns.Count
myCell.Offset(j - 1, i - 1).Formula = "=" & myRange(i, j). _
Address(RowAbsolute:=False, ColumnAbsolute:=False, External:=ExtSt)
Next j
Next i
Exit Sub
MultipleEntry:
Msg = "Трябва да маркирате само една клетка!"
Msg = Msg & vbNewLine & vbNewLine
Msg = Msg & "Желаете ли да опитате отново?"
Ans = MsgBox(Msg & vbNewLine, vbYesNo + vbExclamation)
If Ans = vbYes Then GoTo TryAgain
Exit Sub
errorHandling:
Msg = "Възникна грешка!" & vbNewLine & vbNewLine
Msg = Msg & "Причините могат да бъдат различни." & vbNewLine
Msg = Msg & "Една от тях е маркирана диаграма."
MsgBox Msg, vbCritical
End Sub
Надявам се макроса да е от полза.