Добрый день. Есть, для примера, такой код. Он работает.
Код
Public Sub colorFill()
'
' colorFill Macro
'
Columns("C:C").Select
With Selection.Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.399975585192419
.PatternTintAndShade = 0
End With
End Sub
Как только я пытаюсь заменить строку Columns("C:C").Select на Columns(x & ":" & x).Select, у меня выскакивает сообщение об ошибке Compile Error: Expected Function or variable на строке Selection.
Переменная объявлена как Public x As String до самого Sub, значение x берется из формы, которая вызывается до этого кода. Отдельно в другом модуле код работает, а вот так уже нет.
Код
PriceListAuto.Show
PriceListAuto.MaterialGroup = Split(Range("A1:CZ12").Find("òîâàð*ãð*").Address, "$")(1)
x = PriceListAuto.MaterialGroup
Columns(x & ":" & x).Select
With Selection.Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.399975585192419
.PatternTintAndShade = 0
End With
Не могу понять почему... Заранее благодарю за помощь.
У вас переменная Х, передаваемая в эту инструкцию, чему равна?
p.s. Мне кажется, что работать с целым столбцом - это неправильно. Наверняка данные занимают не весь столбец, а какой-то ограниченный диапазон. Определить его и работать только с ним, исключить всякие Select'ы и макрос заработает ощутимо быстрее.
Можно конечно без select попробовать, но у меня каждый раз разный диапазон задаваемый из формы... мне казалось выделение проще и быстрее сделать столбцами.
Не нужно без явной необходимости выделять ни столбцы, ни диапазоны - только тормоза получите при выполнении кода. Это относится и к Activate ))
Код
Public Sub colorFill()
Dim x As String
x = "C"
' Columns(x & ":" & x).Select
' With Selection.Interior
With Columns(x & ":" & x).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.399975585192419
.PatternTintAndShade = 0
End With
End Sub
invirtus, поставьте точку останова на 1-ю строку вызываемой процедуры. Когда останов произойдет, наведите курсор на х и посмотрите, чему он равен. Option Explicit в начале каждого модуля помогает избегать таких проблем. Установите галку Tools - Options - Editor - Require variable declaration, чтобы редактор сам вставлял эту строку в НОВЫХ модулях. А сам код можно написать без Select
Код
Option Explicit
Public x As String
Public Sub colorFill()
'
' colorFill Macro
'
With Columns(x).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.4
.PatternTintAndShade = 0
End With
End Sub
Да зачем их выделять-то?! В столбце сколько ячеек? А в диапазоне сколько? Как вы думаете, где быстрее сработает - сначала выделить, потом (например) присвоить каждой ячейке какое-то значение, на фоне каждой пятой нарисовать фигу, на фоне каждой четвертой - смокву и в конце еще в первой ячейке написать что-нибудь позитивное?
P.S. Наверное я так и состарюсь, не узнав значение Х передаваемое в инструкцию... хнык...
p.p.s. У меня рождается страшное подозрение... у вас в переменной буковка какой национальности?
Так вон же на картинке выше всё есть... Watches, там значение переменной. в x у меня буква String, С допустим.
Я имел ввиду не выделять, а работать (выделять цветом имел ввиду). Просто у меня не всегда правильно определяется конец диапазона по строкам, если столбец пустой например, тогда вообще ничего не выделится цветом... а если столбец целиком заливать, то такой проблемы не возникнет.
я уже на такое переделал и всё заработало. Непонятно почему With selection не работало, если переменная нормально присваивалась.
Код
PriceListAuto.MaterialGroup = Split(Range("A1:CZ12").Find("òîâàð*ãð*").Address, "$")(1)
xMaterialGroup = PriceListAuto.MaterialGroup
With Columns(xMaterialGroup & ":" & xMaterialGroup).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.399975585192419
.PatternTintAndShade = 0
End With