Пытаюсь доработать, но не копирует формат, может кто поможет? Суть была в пользовательской функции ВПР с копированием формата. При прямом назначение свойств и форматов все работает, а вот копирование формата или значений не работает. Тема обсуждалась здесь [vba]
Код
Function vpr(r1 As Range, r2 As Range, c As Integer) If IsError(Application.VLookup(r1, r2, c, 0)) Then vpr = "" With Application.Caller .Parent.Evaluate "RChangeit(" & .Address(False, False) & ")" End With Exit Function End If If Application.VLookup(r1, r2, c, 0) = "" Then vpr = "" Else vpr = Application.VLookup(r1, r2, c, 0) End If crw = Application.Match(r1, Application.WorksheetFunction.Index(r2, 0, 1), 0) cii = Application.WorksheetFunction.Index(r2, crw, c).Worksheet.Name & "!" & Application.WorksheetFunction.Index(r2, crw, c).Address(False, False) 'MsgBox cii With Application.Caller .Parent.Evaluate "Changeit(" & .Address(False, False) & "," & cii & ")" End With End Function
Sub ChangeIt(c1 As Range, c2 As Range) 'MsgBox 1 c2.Copy 'MsgBox c2.Value c1.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False
'MsgBox c2.Worksheet.Name + c2.Address End Sub
Sub RChangeIt(c1 As Range) c1.ClearFormats End Sub
[/vba]
Пытаюсь доработать, но не копирует формат, может кто поможет? Суть была в пользовательской функции ВПР с копированием формата. При прямом назначение свойств и форматов все работает, а вот копирование формата или значений не работает. Тема обсуждалась здесь [vba]
Код
Function vpr(r1 As Range, r2 As Range, c As Integer) If IsError(Application.VLookup(r1, r2, c, 0)) Then vpr = "" With Application.Caller .Parent.Evaluate "RChangeit(" & .Address(False, False) & ")" End With Exit Function End If If Application.VLookup(r1, r2, c, 0) = "" Then vpr = "" Else vpr = Application.VLookup(r1, r2, c, 0) End If crw = Application.Match(r1, Application.WorksheetFunction.Index(r2, 0, 1), 0) cii = Application.WorksheetFunction.Index(r2, crw, c).Worksheet.Name & "!" & Application.WorksheetFunction.Index(r2, crw, c).Address(False, False) 'MsgBox cii With Application.Caller .Parent.Evaluate "Changeit(" & .Address(False, False) & "," & cii & ")" End With End Function
Sub ChangeIt(c1 As Range, c2 As Range) 'MsgBox 1 c2.Copy 'MsgBox c2.Value c1.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False
'MsgBox c2.Worksheet.Name + c2.Address End Sub
Sub RChangeIt(c1 As Range) c1.ClearFormats End Sub
Блин - вы ломаете мои стереотипы - я был уверен, что менять заливку формулой - практически невозможно. Есть хороший макрос по применению ВИДИМЫХ (это важно - учитывается УФ) форматов, его сделал RANтут - я просто вырвал его кусок. Получилось интересное решение - думаю достойно готового решения.: [vba]
Код
Function vpr(r1 As Range, r2 As Range, c As Integer) If IsError(Application.VLookup(r1, r2, c, 0)) Then vpr = "" With Application.Caller .Parent.Evaluate "RChangeit(" & .Address(False, False) & ")" End With Exit Function End If If Application.VLookup(r1, r2, c, 0) = "" Then vpr = "" Else vpr = Application.VLookup(r1, r2, c, 0) End If crw = Application.Match(r1, Application.WorksheetFunction.Index(r2, 0, 1), 0) cii = Application.WorksheetFunction.Index(r2, crw, c).Interior.ColorIndex
With Application.Caller ' .Parent.Evaluate "rChangeit(" & .Address(False, False) & ")" .Parent.Evaluate "ApplyCellFormatsFromFormatConditions(" & .Address(False, False) & ", '" & r2.Parent.Name & "'!" & Application.WorksheetFunction.Index(r2, crw, c).Address & ")" End With End Function
'Sub ChangeIt(c1 As Range, ci As Integer) ' c1.Interior.ColorIndex = ci 'End Sub
Sub RChangeIt(c1 As Range) c1.Interior.Color = xlNone End Sub
Private Sub ApplyCellFormatsFromFormatConditions(CellPaste As Range, CellCopy As Range) Dim dfBorders As Object, dfFont As Object, dfInterior As Object Dim i&
' CellPaste.NumberFormat = CellCopy.NumberFormat
'%%%%%%%%%%%%%%%%%...Borders...%%%%%%%%%%%%%%%%%%%% Set dfBorders = CellCopy.DisplayFormat.Borders With CellPaste.Borders For i = 1 To 4 .Item(i).LineStyle = dfBorders.Item(i).LineStyle .Item(i).ColorIndex = dfBorders.Item(i).ColorIndex Next End With '%%%%%%%%%%%%%%%%%...Borders...%%%%%%%%%%%%%%%%%%%%
'%%%%%%%%%%%%%%%%%...Font...%%%%%%%%%%%%%%%%%%%% Set dfFont = CellCopy.DisplayFormat.Font With CellPaste.Font .Color = dfFont.Color .Bold = dfFont.Bold .Italic = dfFont.Italic .Strikethrough = dfFont.Strikethrough .Underline = dfFont.Underline .Background = dfFont.Background End With '%%%%%%%%%%%%%%%%%...Font...%%%%%%%%%%%%%%%%%%%%
'%%%%%%%%%%%%%%%%%...Interior...%%%%%%%%%%%%%%%%%%%% Set dfInterior = CellCopy.DisplayFormat.Interior With CellPaste.Interior If Not dfInterior.Gradient Is Nothing Then .Pattern = dfInterior.Pattern Do While .Gradient.ColorStops.Count < dfInterior.Gradient.ColorStops.Count .Gradient.ColorStops.Add (0) DoEvents Loop If .Pattern = 4001 Then .Gradient.RectangleLeft = dfInterior.Gradient.RectangleLeft .Gradient.RectangleRight = dfInterior.Gradient.RectangleRight .Gradient.RectangleTop = dfInterior.Gradient.RectangleTop .Gradient.RectangleBottom = dfInterior.Gradient.RectangleBottom Else .Gradient.Degree = dfInterior.Gradient.Degree End If For i = 1 To dfInterior.Gradient.ColorStops.Count .Gradient.ColorStops(i).Color = dfInterior.Gradient.ColorStops(i).Color .Gradient.ColorStops(i).Position = dfInterior.Gradient.ColorStops(i).Position If dfInterior.Gradient.ColorStops(i).ThemeColor Then _ .Gradient.ColorStops(i).ThemeColor = dfInterior.Gradient.ColorStops(i).ThemeColor .Gradient.ColorStops(i).TintAndShade = dfInterior.Gradient.ColorStops(i).TintAndShade Next Else .Pattern = dfInterior.Pattern If .Pattern <> xlPatternNone Then .Color = dfInterior.Color .PatternColor = dfInterior.PatternColor End If End If End With '%%%%%%%%%%%%%%%%%...Interior...%%%%%%%%%%%%%%%%%%%% End Sub
Блин - вы ломаете мои стереотипы - я был уверен, что менять заливку формулой - практически невозможно. Есть хороший макрос по применению ВИДИМЫХ (это важно - учитывается УФ) форматов, его сделал RANтут - я просто вырвал его кусок. Получилось интересное решение - думаю достойно готового решения.: [vba]
Код
Function vpr(r1 As Range, r2 As Range, c As Integer) If IsError(Application.VLookup(r1, r2, c, 0)) Then vpr = "" With Application.Caller .Parent.Evaluate "RChangeit(" & .Address(False, False) & ")" End With Exit Function End If If Application.VLookup(r1, r2, c, 0) = "" Then vpr = "" Else vpr = Application.VLookup(r1, r2, c, 0) End If crw = Application.Match(r1, Application.WorksheetFunction.Index(r2, 0, 1), 0) cii = Application.WorksheetFunction.Index(r2, crw, c).Interior.ColorIndex
With Application.Caller ' .Parent.Evaluate "rChangeit(" & .Address(False, False) & ")" .Parent.Evaluate "ApplyCellFormatsFromFormatConditions(" & .Address(False, False) & ", '" & r2.Parent.Name & "'!" & Application.WorksheetFunction.Index(r2, crw, c).Address & ")" End With End Function
'Sub ChangeIt(c1 As Range, ci As Integer) ' c1.Interior.ColorIndex = ci 'End Sub
Sub RChangeIt(c1 As Range) c1.Interior.Color = xlNone End Sub
Private Sub ApplyCellFormatsFromFormatConditions(CellPaste As Range, CellCopy As Range) Dim dfBorders As Object, dfFont As Object, dfInterior As Object Dim i&
' CellPaste.NumberFormat = CellCopy.NumberFormat
'%%%%%%%%%%%%%%%%%...Borders...%%%%%%%%%%%%%%%%%%%% Set dfBorders = CellCopy.DisplayFormat.Borders With CellPaste.Borders For i = 1 To 4 .Item(i).LineStyle = dfBorders.Item(i).LineStyle .Item(i).ColorIndex = dfBorders.Item(i).ColorIndex Next End With '%%%%%%%%%%%%%%%%%...Borders...%%%%%%%%%%%%%%%%%%%%
'%%%%%%%%%%%%%%%%%...Font...%%%%%%%%%%%%%%%%%%%% Set dfFont = CellCopy.DisplayFormat.Font With CellPaste.Font .Color = dfFont.Color .Bold = dfFont.Bold .Italic = dfFont.Italic .Strikethrough = dfFont.Strikethrough .Underline = dfFont.Underline .Background = dfFont.Background End With '%%%%%%%%%%%%%%%%%...Font...%%%%%%%%%%%%%%%%%%%%
'%%%%%%%%%%%%%%%%%...Interior...%%%%%%%%%%%%%%%%%%%% Set dfInterior = CellCopy.DisplayFormat.Interior With CellPaste.Interior If Not dfInterior.Gradient Is Nothing Then .Pattern = dfInterior.Pattern Do While .Gradient.ColorStops.Count < dfInterior.Gradient.ColorStops.Count .Gradient.ColorStops.Add (0) DoEvents Loop If .Pattern = 4001 Then .Gradient.RectangleLeft = dfInterior.Gradient.RectangleLeft .Gradient.RectangleRight = dfInterior.Gradient.RectangleRight .Gradient.RectangleTop = dfInterior.Gradient.RectangleTop .Gradient.RectangleBottom = dfInterior.Gradient.RectangleBottom Else .Gradient.Degree = dfInterior.Gradient.Degree End If For i = 1 To dfInterior.Gradient.ColorStops.Count .Gradient.ColorStops(i).Color = dfInterior.Gradient.ColorStops(i).Color .Gradient.ColorStops(i).Position = dfInterior.Gradient.ColorStops(i).Position If dfInterior.Gradient.ColorStops(i).ThemeColor Then _ .Gradient.ColorStops(i).ThemeColor = dfInterior.Gradient.ColorStops(i).ThemeColor .Gradient.ColorStops(i).TintAndShade = dfInterior.Gradient.ColorStops(i).TintAndShade Next Else .Pattern = dfInterior.Pattern If .Pattern <> xlPatternNone Then .Color = dfInterior.Color .PatternColor = dfInterior.PatternColor End If End If End With '%%%%%%%%%%%%%%%%%...Interior...%%%%%%%%%%%%%%%%%%%% End Sub
SLAVICK, Вы ушли от темы, я ж писал что в лоб назначить форматы не проблема (значение передаем, цвет тоже ну и остальное аналогично можно назначить, но это куча телодвижений, вместо того чтоб просто скопировать), а вот почему копирование не работает?
SLAVICK, Вы ушли от темы, я ж писал что в лоб назначить форматы не проблема (значение передаем, цвет тоже ну и остальное аналогично можно назначить, но это куча телодвижений, вместо того чтоб просто скопировать), а вот почему копирование не работает?skais
Сообщение отредактировал skais - Четверг, 07.06.2018, 11:31
SLAVICK, Работает, но конечно через Владивосток, но респект! А в чем причина почему из UDF вызов макроса не позволяет произвести копирование, что-то блокируется на этот момент? Или в чем собственно причина?
SLAVICK, Работает, но конечно через Владивосток, но респект! А в чем причина почему из UDF вызов макроса не позволяет произвести копирование, что-то блокируется на этот момент? Или в чем собственно причина?skais
Я до этого дня думал что менять заливку в функции сразу, можно только через XML книги - оказывается можно и проще, но тут тоже есть свои неудобства, и особенности. Мне кажется, что при использовании 2-го варианта - возможны страшные бАги - поэтому я бы это использовал очень осторожно... хотя может - это просто страх перед неизвестностью .
Но себе забираю в копилку два варианта - первый - безопасный - второй - буду еще смотреть и тестить.
Добавлено не из того окна ссылку скопировал: ВОТ про ограничения
Я до этого дня думал что менять заливку в функции сразу, можно только через XML книги - оказывается можно и проще, но тут тоже есть свои неудобства, и особенности. Мне кажется, что при использовании 2-го варианта - возможны страшные бАги - поэтому я бы это использовал очень осторожно... хотя может - это просто страх перед неизвестностью .
Но себе забираю в копилку два варианта - первый - безопасный - второй - буду еще смотреть и тестить.
Добавлено не из того окна ссылку скопировал: ВОТ про ограниченияSLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Четверг, 07.06.2018, 12:46