nicex Пользователь Сообщений: 167 |
#1 12.07.2019 15:15:57 Добрый день!, выдает ошибку Compile error: variable not defined
Я поменял местаим части кода
Подскажите корректно макрос будет работать ? |
||||
Nordheim Пользователь Сообщений: 3154 |
У вас таблица заполнена не полностью? почему в двух циклах последняя заполненная строка ищется по разным столбцам? Изменено: Nordheim — 12.07.2019 15:25:00 «Все гениальное просто, а все простое гениально!!!» |
nicex Пользователь Сообщений: 167 |
Nordheim, это только часть макроса |
Sanja Пользователь Сообщений: 14837 |
#4 12.07.2019 15:42:43
А самому попробовать? Согласие есть продукт при полном непротивлении сторон. |
||
Nordheim Пользователь Сообщений: 3154 |
#5 12.07.2019 15:49:14
Я вижу, это не ответ на вопрос, если нужна последняя строка диапазона, то я не вижу смысла в двух циклах, «Все гениальное просто, а все простое гениально!!!» |
||
nicex Пользователь Сообщений: 167 |
Sanja, я попробовал, работает, но проблема проверить результат, опасаюсь что в макросе что то не корректно обрабатывается, поэтому хочу понять не приведет ли такая замена на обум к ошибкам Nordheim, мои возможности только методом тыка адаптировать готовый код |
Nordheim Пользователь Сообщений: 3154 |
#7 12.07.2019 16:02:16
Вы не знаете как ответить на вопрос
или не хотите, меня не интересовало полный это макрос или часть, я это и так вижу.
про ваши методы я так же не спрашивал. Вопрос тут в таком случае такой, а вы уверены что код вообще работает правильно, коли вы не знаете почему определение последней заполненной строки производится по разным столбцам? «Все гениальное просто, а все простое гениально!!!» |
||||||
nicex Пользователь Сообщений: 167 |
Nordheim, я объединил два разных макроса. перед второй частью макроса : ////// iLastRow = Cells(Rows.Count, «B»).End(xlUp).Row For i = iLastRow To 1 Step -1 происходит перестановка колонок и еще какие то замены и тп и тд |
Sanja Пользователь Сообщений: 14837 |
Ошибка исчезла? Значит решение задачи, вынесенной в название Темы получено. Все остальное ЭТОЙ темы не касается. Согласие есть продукт при полном непротивлении сторон. |
Jack Famous Пользователь Сообщений: 10481 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#10 12.07.2019 16:41:01
объявите переменную. Для того, чтобы в будущем этого избежать, прочтите инструкцию Прикрепленные файлы
Изменено: Jack Famous — 12.07.2019 16:41:33 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
nicex Пользователь Сообщений: 167 |
Jack Famous, спасибо Sanja, как изменить тему на: Я поменял местаим части кода будет ли корректно макрос работать ? |
vikttur Пользователь Сообщений: 47199 |
Такая ошибка может возникнуть в тысячах разных кодов. |
название темы:
что значит сообщение Compile error: variable not defined при попытке выполнить макрос? ответ: в сообщении все сказано: Ошибка компилятора: неопределенная переменная! решение: 1. удалите строку Option Explicit Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
RAN Пользователь Сообщений: 7081 |
Вить, коды-то разные, причина одна. этого , или этого |
vikttur Пользователь Сообщений: 47199 |
Андрей, одна в Курилке, по второй более-менее понятно по названию. |
Dima S Пользователь Сообщений: 2063 |
#16 13.07.2019 01:53:01
Dim |
||
Хитрости »
1 Май 2011 51029 просмотров
Option Explicit — начинающие программировать в Visual Basic могут увидеть данную строку в чужом коде, либо случайно в своем. Хотя кто-то может быть уже знает, что это и зачем и использует данное объявление намеренно. Я же постараюсь максимально подробно описать смысл этой строки и её полезность для кода в первую очередь для тех, кто еще не знает для чего она.
Строка данная записывается в самом начале модуля, самой первой строкой. Перед этой строкой ничего более не может быть записано, кроме, разве что других подобных строк(есть еще другие :-))
Собственно что же делает эта строка? А делает она следующее: она принуждает Вас объявлять переменные(если не знаете смысл объявления переменных — читайте здесь). Если какая-либо переменная внутри выполняемой процедуры не объявлена — Вы увидите такое вот сообщение:
рис.1
так же редактор VBA выделит ту переменную, которая не объявлена. Первое время это может раздражать. Да и вообще: зачем это? Вы и без всех этих объявлений неплохо жили. А вот зачем
- во-первых: объявление переменных считается хорошим тоном при программировании
- во-вторых: правильное присвоение типов недурно экономит память
- ну и в-третьих(я бы даже сказал в главных): это помогает избежать неявных ошибок кода при несовпадении типов данных
А теперь перейдем к сути и попробуем разобраться в чем же польза от использования Option Explicit. Ниже приведен простой код:
Sub Check_Variables() Dim a As String a = "Привет от www.excel-vba.ru" MsgBox а, vbInformation End Sub
Выполните данный код без строки Option Explicit. Какое значение выдаст MsgBox? Ничего. Что за странность? Ведь явно видно, что переменной присвоено значение текста. Ничего больше не происходит. Но переменная все равно пуста. Мистика…А теперь запишите первой строкой в модуле Option Explicit:
Option Explicit Sub Check_Variables() Dim a As String a = "Привет от www.excel-vba.ru" MsgBox а, vbInformation End Sub
Запустите код. И что же видите? Видите сообщение, показанное на рис.1 и выделенную переменную «а», в последней строке. Что это означает? Это означает, что переменная «а» у нас не объявлена. А все потому, что первой строкой (Dim a As String) я объявил переменную на английском языке, а в последней строке я записал её на русском. А для кода это разные символы. Если разглядеть логику работы VBA — первую «а» он видит как переменную с присвоенным типом String. И ей мы задаем значение «Привет от www.excel-vba.ru». А вторую…Вторую он не находит в объявленных переменных, не находит в функциях и сам инициализирует её как новую переменную с типом данных Variant. И, что вполне логично, со значением Empty, т.е. ничего, т.к. этой переменной мы никаких значений не присваивали.
Еще один классический пример, когда Option Explicit спасет от лишних мозговых штурмов. Имеем простую функцию пользователя(UDF), которая берет указанную дату и возвращает её в заранее заданном формате в текстовом виде:
Function GetDateAsText(Optional ByVal Дата As Date) If Дата = 0 Then Дата = Date End If GetDataAsText = Format(Дата, "DD MMMM YYYY") End Function
Хоть функция и короткая, но даже в ней не сразу порой бросается в глаза опечатка(представим, если функция в реальности строк на 200). В итоге чаще всего автор функции не понимает, почему при записи её на листе она возвращает не дату вида «21 мая 2016», а 0 и начинает пошагово выполнять функцию, искать ошибки в логике кода и т.д. Но если поставить в начало модуля Option Explicit, то при первом же выполнении этой функции VBA подсветит нам «GetDataAsText = «, указывая тем самым, что GetDataAsText в чем-то отличается от заданного имени функции — GetDateAsText. Банальная опечатка: GetDataAsText — GetDateAsText.
А теперь представьте себе, что Вы написали кучу длинного кода, строк на 100 или более. Конечно, Option Explicit Вы не используете. И вот Вы тестируете код, но он работает как-то не так…Где-то что-то неверно выполняется. И Вы начинаете пошагово ковыряться в листинге и искать ошибку…А ведь все может быть и проще: где-то в коде Вы могли банально опечататься и присвоить таким образом значение переменной, на которую Вы и не рассчитывали. А если использовать Option Explicit, то такая опечатка будет сразу обнаружена еще до выполнения кода и, что немаловажно — подсвечена. Так что Вам даже не придется её искать, а останется лишь исправить ошибку.
Так же эта строка поможет избежать неявных ошибок и в других ситуациях. В частности, при обращении к другим приложениями(Word, Outlook и т.д.). Например, в Excel применяются именованные константы для многих задач. Одна из распространенных — поиск последней ячейки в столбце: llast = Cells(Rows.Count, 1).End(xlUp).Row
здесь xlUp является именованной константой, значение которой равно числу: -4162. В других приложениях такой же подход. Это избавляет от необходимости помнить на память все значения констант и обращаться к ним при помощи intellisense. Но действуют эти константы исключительно внутри своего приложения(можете обратить внимание, у Excel константы начинаются с xl, а у Word — с wd). И т.к. объявлены эти константы в других приложениях — Excel про них не знает(как и другие приложения не знают про константы Excel). Для примера возьмем простой и рабочий код замены в Word:
Dim wdDoc As Object Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
Где wdFindContinue для Word-а равно 1, а wdReplaceAll = 2. Но это происходит только при выполнении изнутри самого Word-а(или при раннем связывании через Tools —References. Подробнее про это можно почитать в статье: Как из Excel обратиться к другому приложению).
Если же скопировать и выполнять данный код из Excel, то работать он будет не так как задумали. Дело в том, что Вы считаете, что Excel работает с обозначенными константами(wdFindContinue, wdReplaceAll) наравне с Word-ом. Но Excel на самом деле про них ничего не знает. И если директива Option Explicit будет отключена, то Excel просто назначает им значение по умолчанию — Empty. Которое преобразуется в 0. А это совсем иной поиск получается, т.к. должны быть значения 1 и 2. А если бы Option Explicit была включена, то Excel выделил бы их и указал, что они не объявлены. И тогда можно было бы сделать либо так:
Dim wdDoc As Object Const wdFindContinue As Long = 1 Const wdReplaceAll As Long = 2 Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
либо так(что удобнее, на мой взгляд):
Dim wdDoc As Object Set wdDoc = objWordApp.ActiveDocument With wdDoc.Range.Find .Text = "привет" .Replacement.Text = "привет" .wrap = 1 .Execute Replace:=2 End With
Так что думаю, не стоит недооценивать значимость строки Option Explicit при написании кодов. В довершение хотелось бы Вас обрадовать, что вписывание данной строки в начало каждого модуля можно сделать автоматическим: поставить в опциях редактора галочку: Tools—Options-вкладка Editor—Require Variable Declaration. Теперь во всех новых созданных модулях строка Option Explicit будет создаваться самим редактором VBA автоматически. К сожалению, в уже имеющихся модулях Вам придется проставить данную строку самим вручную. Но это того стоит, поверьте.
Так же см.:
Что такое переменная и как правильно её объявить?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
При выполнении макросов Excel могут возникнуть ошибки, которые в VBA делят на три категории:
- Ошибки компиляции
- Ошибки выполнения
- Логические ошибки (баги)
Далее мы поговорим о каждом из трёх типов ошибок VBA подробно.
Содержание
- Ошибки компиляции
- Ошибки выполнения
- Перехват ошибок выполнения
- Логические ошибки
Ошибки компиляции
Компилятор VBA рассматривает ошибки компиляции как недопустимые и выделяет их в коде ещё до того, как дело дойдёт до запуска макроса.
Если при написании кода допущена синтаксическая ошибка, то редактор VBA сигнализирует об этом немедленно: либо при помощи окна с сообщением, либо выделяя ошибку красным цветом, в зависимости от статуса режима Auto Syntax Check.
Примечание: При включённом режиме Auto Syntax Check каждый раз, при появлении в редакторе Visual Basic во введённом коде синтаксической ошибки, будет показано соответствующее сообщение. Если же этот режим выключен, то редактор VBA продолжит сообщать о синтаксических ошибках, просто выделяя их красным цветом. Опцию Auto Syntax Check можно включить/выключить в меню Tools > Options редактора Visual Basic.
В некоторых случаях ошибка компиляции может быть обнаружена при выполнении компиляции кода, непосредственно перед тем, как макрос будет выполнен. Обычно ошибку компиляции несложно обнаружить и исправить, потому что компилятор VBA даёт информацию о характере и причине ошибки.
Например, сообщение «Compile error: Variable not defined» при попытке запустить выполнение кода VBA говорит о том, что происходит попытка использовать или обратиться к переменной, которая не была объявлена для текущей области (такая ошибка может возникнуть только если используется Option Explicit).
Ошибки выполнения
Ошибки выполнения возникают в процессе выполнения кода и приводят к остановке выполнения программы. Этот тип ошибок VBA, как правило, также не сложно обнаружить и исправить, так как сообщается информация о характере ошибки и место в коде, где произошла остановка.
Примером такой ошибки может служить попытка выполнить деление на ноль. В результате будет показано сообщение «Run-time error ’11’: Division by zero«.
В зависимости от структуры проекта VBA, может быть предложено выполнить отладку кода (как показано на рисунке ниже). В этом случае при нажатии на кнопку Debug (в окне сообщения о необходимости отладки) будет выделена цветом строка кода, которая стала причиной ошибки VBA.
Получив такое сообщение и видя выделенную строку кода, как в приведённом выше примере, обнаружить причину ошибки будет совсем не сложно.
В случае если код сложнее, чем в нашем примере, то, чтобы получить больше информации о причине возникновения ошибки VBA, можно проверить значения используемых переменных. В редакторе VBA для этого достаточно навести указатель мыши на имя переменной, или можно открыть окно отслеживания локальных переменных (в меню редактора View > Locals Window).
Коды различных ошибок выполнения расшифрованы на сайте Microsoft Support (на английском). Наиболее часто встречающиеся ошибки VBA перечислены в этой таблице:
5 | Недопустимый вызов процедуры (Invalid procedure call) |
7 | Недостаточно памяти (Out of memory) |
9 | Индекс вне заданного диапазона (Subscript out of range)
Эта ошибка возникает при попытке обратиться к элементу массива за пределами заданного размера массива – например, если объявлен массив с индексами от 1 до 10, а мы пытаемся обратиться к элементу этого же массива с индексом 11. |
11 | Деление на ноль (Division by zero) |
13 | Несоответствие типа (Type mismatch)
Эта ошибка возникает при попытке присвоить переменной значение не соответствующего типа – например, объявлена переменная i типа Integer, и происходит попытка присвоить ей значение строкового типа. |
53 | Файл не найден (File not found)
Иногда возникает при попытке открыть не существующий файл. |
Перехват ошибок выполнения
Не все ошибки выполнения бывают вызваны недочётами в коде. Например, ошибки VBA не удастся избежать, если для работы макроса необходимо открыть файл с данными, а этого файла не существует. В таких случаях признаком профессионализма будет перехват ошибок и написание кода VBA, который будет выполняться при их возникновении. Таким образом, вместо неприятных сбоев будет происходить изящное завершение работы макроса.
Для того, чтобы помочь справиться с возникающими ошибками, VBA предоставляет разработчику операторы On Error и Resume. Эти операторы отслеживают ошибки и направляют выполнение макроса в специальный раздел кода VBA, в котором происходит обработка ошибки. После выполнения кода обработки ошибки, работа программы может быть продолжена с того места, где возникла ошибка, или макрос может быть остановлен полностью. Далее это показано на примере.
'Процедура Sub присваивает переменным Val1 и Val2 значения, 'хранящиеся в ячейках A1 и B1 рабочей книги Data.xlsx расположенной в каталоге C:Documents and Settings Sub Set_Values(Val1 As Double, Val2 As Double) Dim DataWorkbook As Workbook On Error GoTo ErrorHandling 'Открываем рабочую книгу с данными Set DataWorkbook = Workbooks.Open("C:Documents and SettingsData") 'Присваиваем переменным Val1 и Val2 данные из рабочей книги DataWorkbook Val1 = Sheets("Лист1").Cells(1, 1) Val2 = Sheets("Лист1").Cells(1, 2) DataWorkbook.Close Exit Sub ErrorHandling: 'Если файл не найден, предлагаем пользователю разместить его в 'нужном месте и продолжить работу MsgBox "Рабочая книга не найдена! " & _ "Пожалуйста добавьте книгу Data.xlsx в каталог C:Documents and Settings и нажмите OK." Resume End Sub
В этом коде производится попытка открыть файл Excel с именем Data. Если файл не найден, то пользователю будет предложено поместить этот файл в нужную папку. После того, как пользователь сделает это и нажмёт ОК, выполнение кода продолжится, и попытка открыть этот файл повторится. При желании вместо попытки открыть нужный файл, выполнение процедуры Sub может быть прервано в этом месте при помощи команды Exit Sub.
Логические ошибки
Логические ошибки (или баги) возникают в процессе выполнения кода VBA, но позволяют ему выполняться до самого завершения. Правда в результате могут выполняться не те действия, которые ожидалось, и может быть получен неверный результат. Такие ошибки обнаружить и исправить труднее всего, так как компилятор VBA их не распознаёт и не может указать на них так, как это происходит с ошибками компиляции и выполнения.
Например, при создании макроса в процедуре случайно были просуммированы не те переменные, которые требовалось просуммировать. Результат будет ошибочным, но макрос будет продолжать выполняться до завершения.
Редактор Excel VBA предоставляет набор инструментов отладки, которые помогут найти и исправить логические ошибки в коде VBA. В данной статье мы не будем рассматривать подробно эти инструменты. Любознательный пользователь может найти обзор инструментов отладки VBA на сайте Microsoft Help & Support (на английском).
Оцените качество статьи. Нам важно ваше мнение:
-
#1
This is my first post. Greetings from Athens, TX!
I’ve used Excel for many years, but finally am learning VBA, using Excel Progamming for Dummies by John Walkenbach. Excel is version 2000.
I’ve searched extensively on Google and on the MrExcel site for the solution to my problem, but still haven’t found it . Any direction would be most appreciated.
I’m trying to execute the examples in the book, and have gotten the error message «Compile error: Variable not defined» with «MyString =» highlighted with several of the examples. Could someone please tell me where I’m going astray?
Following is the latest subroutine I typed into the module, from page 124:
Option Explicit
Sub GetLength()
MyString = «Hello World»
StringLength = Len(MyString)
MsgBox StringLength
End Sub
Thank you for your help!
Mark Carlson
Quick Sum
Select a range of cells. The total appears in bottom right of Excel screen. Right-click total to add Max, Min, Count, Average.
-
#2
Try
Code:
Sub GetLength()
Dim MYstring As String
MYstring = "Hello World"
StringLength = Len(MYstring)
MsgBox StringLength
End Sub
-
#3
Thanks, but the same error message is here, and «StringLength =» is still highlighted.
Mark
-
#4
Welcome to the board.
Well, yes. When you googled, did you search on the term «option explicit»? That forces variable declarations.
Code:
Option Explicit
Sub GetLength()
dim strMyString as string, lngStringLength as long
strMyString = "Hello World"
lngStringLength = Len(strMyString)
MsgBox lngStringLength
End Sub
Last edited: May 27, 2008
-
#5
Oops!
Code:
Sub GetLength()
Dim MYstring As String, StringLength As Integer
MYstring = "Hello World"
StringLength = Len(MYstring)
MsgBox StringLength
End Sub
The reason that you are getting these errors is that you have set ‘Require variable declaration’ in Tools > Options which is a very good idea. Shame Walchenbach et al. didn’t think of that!
-
#6
Greg,
I didn’t Google «Option Explicit» (OE). The book suggested using OE as a matter of course. I’ve seen that stated several other places while trying to figure this out.
Thanks, Mark
-
#8
Declare your variables. (= appear in a DIM statement prior to usage)
-
#9
Greg,
I’m afraid I’m not quite getting this. Do you mean I need an «=» in the dim statement? Also in your signature you have the hint about CODE tags. Would that be 010, 020, etc at the start of the lines?
Have a great evening!
Thanks again, Mark
RoryA
MrExcel MVP, Moderator
-
#10
Option Explicit requires you to declare all your variables. In your code, you use two variables, MyString and StringLength, so you have to declare them:
Code:
Dim MyString As String, StringLength as Long
(note, you don’t have to declare them as having a specific type/interface, but it’s good practice to do so where possible)
The code tags are what I used above to make the code line stand out.
Regards,
Rory
0 / 0 / 1 Регистрация: 23.10.2012 Сообщений: 135 |
|
1 |
|
04.01.2013, 00:34. Показов 16990. Ответов 3
всем привет, у меня выскочила ошибка и я не знаю что делать, подскажите как исправить Миниатюры
__________________
0 |
Dragokas 17954 / 7591 / 889 Регистрация: 25.12.2011 Сообщений: 11,323 Записей в блоге: 17 |
||||
04.01.2013, 00:47 |
2 |
|||
Уберите в самом верху кода обязательную декларацию переменных:
или задавайте типизацию с помощью команды Dim
0 |
Казанский 15131 / 6405 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
04.01.2013, 01:18 |
3 |
|||
Сообщение было отмечено как решение РешениеПри чем тут типизация? Просто переменная не объявлена. Обявите ее сразу после заголовка процедуры
, а в процедуре можете называть ее просто i без указания типа.
6 |
Заблокирован |
|
04.01.2013, 16:55 |
4 |
Казанский, И в правду тебе нет цены !
0 |
|
|
02-05-2006, 10:25 PM
#1
Variable not defined comple error
New to VBA. Excel 2003
I’m getting a compile error: Variable not defined, in the following Macro.
(General) = Open Explicit.
How do I set the variable for CounterSub ItemsToPrice()
For Counter = 1 To 300
Set curCell = Worksheets(«Sheet4»).Cells(Counter, 18)
If Abs(curCell.Value) = 2 Then curCell.Select
Range(«C» & ActiveCell.Row & «:M» & ActiveCell.Row).Select
With Selection.Interior
.ColorIndex = 37
.Pattern = xlSolid
End With
Selection.Font.ColorIndex = 3
Selection.Font.Bold = True
Range(«R» & ActiveCell.Row).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Range(«H» & ActiveCell.Row).Select
Selection.ClearContents
Next Counter
End Sub
02-05-2006, 10:35 PM
#2
Re: Variable not defined comple error
Sub ItemsToPrice()
dim Counter as integer
For Counter = 1 To 300
‘etcTim
«BrianW» <BrianW@discussions.microsoft.com> wrote in message
news:5CE95B1A-530B-46DD-8830-1BFF2E323CA6@microsoft.com…
> New to VBA. Excel 2003
> I’m getting a compile error: Variable not defined, in the following Macro.
> (General) = Open Explicit.
> How do I set the variable for Counter
>
> Sub ItemsToPrice()
> For Counter = 1 To 300
> Set curCell = Worksheets(«Sheet4»).Cells(Counter, 18)
> If Abs(curCell.Value) = 2 Then curCell.Select
> Range(«C» & ActiveCell.Row & «:M» & ActiveCell.Row).Select
> With Selection.Interior
> .ColorIndex = 37
> .Pattern = xlSolid
> End With
> Selection.Font.ColorIndex = 3
> Selection.Font.Bold = True
> Range(«R» & ActiveCell.Row).Select
> Selection.Copy
> Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
> SkipBlanks _
> :=False, Transpose:=False
> Range(«H» & ActiveCell.Row).Select
> Selection.ClearContents
> Next Counter
> End Sub
02-05-2006, 10:40 PM
#3
Re: Variable not defined comple error
You meant to put:
Option Explicit
at the top of your module.This tells excel that you want to be force to declare your variables:
Dim Counter As Long
dim CurCell as rangeBut you can do lots of stuff without selecting the ranges. But it’s kind of
difficult to see what you’re doing.You check that to see if the curcell.value = 2 and select that cell. But the
next line, you select C:M of that row. So selecting that single cell doesn’t
really do anything.Since I don’t quite understand what you want, this might give you a starting
point—if you want to check a value and do something, maybe you can add it to
this shell:Option Explicit
Sub ItemsToPrice()
Dim Counter As Long
Dim CurCell As RangeWith Worksheets(«Sheet4»)
For Counter = 1 To 300
With .Range(«C» & Counter & «:M» & Counter)
.Interior.ColorIndex = 37
.Interior.Pattern = xlSolid
.Font.ColorIndex = 3
.Font.Bold = True
End With
With .Range(«R» & Counter)
.Copy
.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With
.Range(«H» & Counter).ClearContents
Next Counter
End With
End SubAs written, this just format C1:M300 row by row, converts R1:R300 to values and
cleans up H3:H300.You can do that without the loop:
Option Explicit
Sub ItemsToPrice()
Dim Counter As Long
Dim CurCell As RangeWith Worksheets(«Sheet4»)
With .Range(«C1:M300»)
.Interior.ColorIndex = 37
.Interior.Pattern = xlSolid
.Font.ColorIndex = 3
.Font.Bold = True
End With
With .Range(«R1:r300»)
.Copy
.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With
.Range(«H1:H300»).ClearContents
End With
End SubBrianW wrote:
>
> New to VBA. Excel 2003
> I’m getting a compile error: Variable not defined, in the following Macro.
> (General) = Open Explicit.
> How do I set the variable for Counter
>
> Sub ItemsToPrice()
> For Counter = 1 To 300
> Set curCell = Worksheets(«Sheet4»).Cells(Counter, 18)
> If Abs(curCell.Value) = 2 Then curCell.Select
> Range(«C» & ActiveCell.Row & «:M» & ActiveCell.Row).Select
> With Selection.Interior
> .ColorIndex = 37
> .Pattern = xlSolid
> End With
> Selection.Font.ColorIndex = 3
> Selection.Font.Bold = True
> Range(«R» & ActiveCell.Row).Select
> Selection.Copy
> Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
> SkipBlanks _
> :=False, Transpose:=False
> Range(«H» & ActiveCell.Row).Select
> Selection.ClearContents
> Next Counter
> End Sub—
Dave Peterson
02-05-2006, 11:30 PM
#4
Re: Variable not defined comple error
Hi Dave and Tim. Thanks for the replies
What I have is a pricing workbook that loads a csv file and price building
products that I measure for clients. If a product has been nominated by the
designer that isnt in the database my vlookup formula returns exlNAerror
value which is converted into a 2 in column R by way of formula. I then
filter all the 2’s, formate the cells in that row pertaining to the
corrosponding 2 from columns C-M. I then F2 F9 the cell with the formula in
column R so that when I clear the error value in column H my client can find
the rows that require special pricing. I hope this helps?Dave when I run your 1st macro I’m getting a script out of range error.
Tim when I run yours it works but my macro takes a dreadfully long time to
complete. Since I have 2Gb of ram 200 SATA HD ND7800 grahic card and 3200
dual processor it has to be my code. You guys may see a better way now that
you are fulyy in the picture.
Is there a way to limit the search to say the last row rather than
nominating 300. I do have a 3 in column B which indicates the end of data.
Your input is greatly valued«Dave Peterson» wrote:
> You meant to put:
> Option Explicit
> at the top of your module.
>
> This tells excel that you want to be force to declare your variables:
>
> Dim Counter As Long
> dim CurCell as range
>
> But you can do lots of stuff without selecting the ranges. But it’s kind of
> difficult to see what you’re doing.
>
> You check that to see if the curcell.value = 2 and select that cell. But the
> next line, you select C:M of that row. So selecting that single cell doesn’t
> really do anything.
>
> Since I don’t quite understand what you want, this might give you a starting
> point—if you want to check a value and do something, maybe you can add it to
> this shell:
>
> Option Explicit
> Sub ItemsToPrice()
> Dim Counter As Long
> Dim CurCell As Range
>
> With Worksheets(«Sheet4»)
> For Counter = 1 To 300
> With .Range(«C» & Counter & «:M» & Counter)
> .Interior.ColorIndex = 37
> .Interior.Pattern = xlSolid
> .Font.ColorIndex = 3
> .Font.Bold = True
> End With
> With .Range(«R» & Counter)
> .Copy
> .PasteSpecial Paste:=xlPasteValues, _
> Operation:=xlNone, SkipBlanks:=False, Transpose:=False
> End With
> .Range(«H» & Counter).ClearContents
> Next Counter
> End With
> End Sub
>
> As written, this just format C1:M300 row by row, converts R1:R300 to values and
> cleans up H3:H300.
>
> You can do that without the loop:
> Option Explicit
> Sub ItemsToPrice()
> Dim Counter As Long
> Dim CurCell As Range
>
> With Worksheets(«Sheet4»)
> With .Range(«C1:M300»)
> .Interior.ColorIndex = 37
> .Interior.Pattern = xlSolid
> .Font.ColorIndex = 3
> .Font.Bold = True
> End With
> With .Range(«R1:r300»)
> .Copy
> .PasteSpecial Paste:=xlPasteValues, _
> Operation:=xlNone, SkipBlanks:=False, Transpose:=False
> End With
> .Range(«H1:H300»).ClearContents
> End With
> End Sub
>
>
>
> BrianW wrote:
> >
> > New to VBA. Excel 2003
> > I’m getting a compile error: Variable not defined, in the following Macro.
> > (General) = Open Explicit.
> > How do I set the variable for Counter
> >
> > Sub ItemsToPrice()
> > For Counter = 1 To 300
> > Set curCell = Worksheets(«Sheet4»).Cells(Counter, 18)
> > If Abs(curCell.Value) = 2 Then curCell.Select
> > Range(«C» & ActiveCell.Row & «:M» & ActiveCell.Row).Select
> > With Selection.Interior
> > .ColorIndex = 37
> > .Pattern = xlSolid
> > End With
> > Selection.Font.ColorIndex = 3
> > Selection.Font.Bold = True
> > Range(«R» & ActiveCell.Row).Select
> > Selection.Copy
> > Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
> > SkipBlanks _
> > :=False, Transpose:=False
> > Range(«H» & ActiveCell.Row).Select
> > Selection.ClearContents
> > Next Counter
> > End Sub
>
> —
>
> Dave Peterson
>
02-05-2006, 11:40 PM
#5
Re: Variable not defined comple error
Hi Guy’s
Dave I just ran your second macro and it works fine up to the paste in
column R. Run time error 1004 click on a single cell and paste.
Cheers
02-06-2006, 12:00 AM
#6
Re: Variable not defined comple error
Here’s my best guess based on your description
Tim
****************************************
Sub ItemsToPrice()
Dim Counter As Integer
Dim sht As Worksheet
Set sht = ThisWorkbook.Worksheets(«Sheet4»)For Counter = 1 To 300
With sht.Rows(Counter)If Abs(.Cells(18).Value) = 2 Then
With Range(.Cells(3), .Cells(13))
.Interior.ColorIndex = 37
.Interior.Pattern = xlSolid
.Font.ColorIndex = 3
.Font.Bold = True
End With.Cells(18).Value = .Cells(18).Value
.Cells(8).ClearContents
End IfEnd With
Next Counter
End Sub
***************************************«BrianW» <BrianW@discussions.microsoft.com> wrote in message
news:3A3A506E-25F8-484D-AED4-52F25E71574F@microsoft.com…
> Hi Dave and Tim. Thanks for the replies
> What I have is a pricing workbook that loads a csv file and price building
> products that I measure for clients. If a product has been nominated by
> the
> designer that isnt in the database my vlookup formula returns exlNAerror
> value which is converted into a 2 in column R by way of formula. I then
> filter all the 2’s, formate the cells in that row pertaining to the
> corrosponding 2 from columns C-M. I then F2 F9 the cell with the formula
> in
> column R so that when I clear the error value in column H my client can
> find
> the rows that require special pricing. I hope this helps?
>
> Dave when I run your 1st macro I’m getting a script out of range error.
> Tim when I run yours it works but my macro takes a dreadfully long time to
> complete. Since I have 2Gb of ram 200 SATA HD ND7800 grahic card and 3200
> dual processor it has to be my code. You guys may see a better way now
> that
> you are fulyy in the picture.
> Is there a way to limit the search to say the last row rather than
> nominating 300. I do have a 3 in column B which indicates the end of data.
> Your input is greatly valued
>
> «Dave Peterson» wrote:
>
>> You meant to put:
>> Option Explicit
>> at the top of your module.
>>
>> This tells excel that you want to be force to declare your variables:
>>
>> Dim Counter As Long
>> dim CurCell as range
>>
>> But you can do lots of stuff without selecting the ranges. But it’s kind
>> of
>> difficult to see what you’re doing.
>>
>> You check that to see if the curcell.value = 2 and select that cell. But
>> the
>> next line, you select C:M of that row. So selecting that single cell
>> doesn’t
>> really do anything.
>>
>> Since I don’t quite understand what you want, this might give you a
>> starting
>> point—if you want to check a value and do something, maybe you can add
>> it to
>> this shell:
>>
>> Option Explicit
>> Sub ItemsToPrice()
>> Dim Counter As Long
>> Dim CurCell As Range
>>
>> With Worksheets(«Sheet4»)
>> For Counter = 1 To 300
>> With .Range(«C» & Counter & «:M» & Counter)
>> .Interior.ColorIndex = 37
>> .Interior.Pattern = xlSolid
>> .Font.ColorIndex = 3
>> .Font.Bold = True
>> End With
>> With .Range(«R» & Counter)
>> .Copy
>> .PasteSpecial Paste:=xlPasteValues, _
>> Operation:=xlNone, SkipBlanks:=False,
>> Transpose:=False
>> End With
>> .Range(«H» & Counter).ClearContents
>> Next Counter
>> End With
>> End Sub
>>
>> As written, this just format C1:M300 row by row, converts R1:R300 to
>> values and
>> cleans up H3:H300.
>>
>> You can do that without the loop:
>> Option Explicit
>> Sub ItemsToPrice()
>> Dim Counter As Long
>> Dim CurCell As Range
>>
>> With Worksheets(«Sheet4»)
>> With .Range(«C1:M300»)
>> .Interior.ColorIndex = 37
>> .Interior.Pattern = xlSolid
>> .Font.ColorIndex = 3
>> .Font.Bold = True
>> End With
>> With .Range(«R1:r300»)
>> .Copy
>> .PasteSpecial Paste:=xlPasteValues, _
>> Operation:=xlNone, SkipBlanks:=False, Transpose:=False
>> End With
>> .Range(«H1:H300»).ClearContents
>> End With
>> End Sub
>>
>>
>>
>> BrianW wrote:
>> >
>> > New to VBA. Excel 2003
>> > I’m getting a compile error: Variable not defined, in the following
>> > Macro.
>> > (General) = Open Explicit.
>> > How do I set the variable for Counter
>> >
>> > Sub ItemsToPrice()
>> > For Counter = 1 To 300
>> > Set curCell = Worksheets(«Sheet4»).Cells(Counter, 18)
>> > If Abs(curCell.Value) = 2 Then curCell.Select
>> > Range(«C» & ActiveCell.Row & «:M» & ActiveCell.Row).Select
>> > With Selection.Interior
>> > .ColorIndex = 37
>> > .Pattern = xlSolid
>> > End With
>> > Selection.Font.ColorIndex = 3
>> > Selection.Font.Bold = True
>> > Range(«R» & ActiveCell.Row).Select
>> > Selection.Copy
>> > Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
>> > SkipBlanks _
>> > :=False, Transpose:=False
>> > Range(«H» & ActiveCell.Row).Select
>> > Selection.ClearContents
>> > Next Counter
>> > End Sub
>>
>> —
>>
>> Dave Peterson
>>
02-06-2006, 12:10 AM
#7
Re: Variable not defined comple error
I don’t see why the copy|paste didn’t work.
If the subscript out of range error occurred on this line:
With Worksheets(«Sheet4»)
then you don’t really have a worksheet named Sheet4. Change it to what you
want.If you can pick out a column that always has data, you can find the last row in
the column via:dim LastRow as Long
with worksheets(«sheet4»)
lastrow = .cells(.rows.count,»A»).end(xlup).row
for irow = 1 to lastrow…..
Fix the worksheet name here, too.
BrianW wrote:
>
> Hi Guy’s
> Dave I just ran your second macro and it works fine up to the paste in
> column R. Run time error 1004 click on a single cell and paste.
> Cheers—
Dave Peterson
02-06-2006, 01:30 AM
#8
Re: Variable not defined comple error
Hi Guy’s
Yip I’ve got it working.
Really appreciated your help
Once again thanks for your help.«Dave Peterson» wrote:
> I don’t see why the copy|paste didn’t work.
>
> If the subscript out of range error occurred on this line:
> With Worksheets(«Sheet4»)
> then you don’t really have a worksheet named Sheet4. Change it to what you
> want.
>
> If you can pick out a column that always has data, you can find the last row in
> the column via:
>
> dim LastRow as Long
> with worksheets(«sheet4»)
> lastrow = .cells(.rows.count,»A»).end(xlup).row
> for irow = 1 to lastrow
>
> …..
>
> Fix the worksheet name here, too.
>
>
>
> BrianW wrote:
> >
> > Hi Guy’s
> > Dave I just ran your second macro and it works fine up to the paste in
> > column R. Run time error 1004 click on a single cell and paste.
> > Cheers
>
> —
>
> Dave Peterson
>