Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 2)

Автор: MaximuS G
Дата сообщения: 17.09.2008 13:20
Подскажите, в чем может быть причина, когда раньше писал такой код все было нормально

Mas_Array(i) = Cells(i, 5).Value или
Cells(i, 3).Value = Mas_Array(i)

Теперь выдает ошибку: sabscript out of range
Я в шоке! Даже если поменять i на значения, все равно тоже самое
Посмотрите код пожалуйста:


Код:
Sub test()
Dim Arr(1 To 12)
Dim i, row As Integer

i = 1
For row = 7 To 19
Arr(i) = Cells(row, 3).Value
i = i + 1
Next row


End Sub
Автор: mic21
Дата сообщения: 17.09.2008 13:23
MaximuS G
Вот примерно таблицы которые нужны...
http://slil.ru/26153371

Добавлено:
Oyger
Начальник так хочет ) но я так понял что можно в макросе напиать чтобы он сам тогда чтоли открывал их.... но в принцепи это не самая большая беда )))) можно и чтобы открывать, но лижбы все копировало верно... и т.к. надо )
Автор: Solenaja
Дата сообщения: 17.09.2008 14:10
MaximuS G
почитай предыдущую страницу
Автор: MaximuS G
Дата сообщения: 17.09.2008 14:25
Solenaja
Видимо действительно отличается 2003 от 2007
Дальше не знаю как помочь, у самого куча вопросов
Автор: Pravoved90
Дата сообщения: 17.09.2008 15:49
Уважаемые специалисты, ответьте на несложный вопрос: Есть Лист1 и Лист2. Есть макрос, записаный в Лист1 такого содержанмия
Range("Лист1!E6:G6").Select
Selection.Copy
Range("Лист1!H6").Select
ActiveSheet.Paste
End Sub

В листе1 он работает как надо. Но если я его пытаюсь запустить из листа2(или любого другого листа), выпадает ошибка:
метод select из класса range завершен неверно
и ссылается на Range("Лист1!E6:G6").Select
Что это и как с ним бороться?
Автор: WowGun
Дата сообщения: 17.09.2008 15:58
MaximuS G
Dim Arr(1 To 12) и For row = 7 To 19

Pravoved90

записанный в Лист1

а чего НЕ в Module?
Автор: Pravoved90
Дата сообщения: 17.09.2008 17:05
WowGun
Записал в модуль...не помогло(((
Автор: USERJT
Дата сообщения: 17.09.2008 17:21
Помоги, написать макрос:
Задача
несколько строк примерно 100 строк.
Из них несколько имеют цвет например желтый.
Мне надо все желнтые строки найти, и рядом , стоящем столбце проставить цифру например 5
Спасибо за помощь.
Автор: Oyger
Дата сообщения: 17.09.2008 17:32
Pravoved90
Если тебе надо выбрать лист (сменить его) пишешь: Sheets("XXX").Select 'ХХХ - имя выбираемого листа
Если на листе надо выбрать ячейку (диапазон): Range("F1:R10").Select 'F1:R10 - в качестве примера
Автор: WowGun
Дата сообщения: 17.09.2008 17:34
USERJT

рядом стоящий столбец от желтой строки - это КАКОЙ? :u)

для записи в столбец "B"

Sub Макрос1()

For i = 1 To 100 ' для 100 ячеек
If Range("A" & i).Interior = 6 Then ' для желтого цвета
Range("B" & i) = 5
End If
Next

End Sub

Pravoved90
Вы чего собственно хотите - чтобы на ВСЕХ листах РАБОТАЛО, т.е. для каждого листа или с какого бы листа не запустить - все равно ТОЛЬКО на 1-м листе идет обработка?
если ПОСЛЕДНЕЕ то добавьте в начале Sheets("Лист1").Select
Автор: Oyger
Дата сообщения: 17.09.2008 17:39
мист...
Автор: q1wed
Дата сообщения: 17.09.2008 17:44
Pravoved90
Цитата:
Записал в модуль...не помогло(((

зная что ты делаешь, скажу не туда тебя опять потянуло!!

и замени уже

Код: Range("Лист1!E6:G6").Select
Selection.Copy
Range("Лист1!H6").Select
ActiveSheet.Paste
Автор: Pravoved90
Дата сообщения: 17.09.2008 18:01
Oyger
WowGun
Огромне спасибо за помощь)))
Помогите еще сделать небольшое дополнение.
Условия теже.Когда я запускаю макрос, который производит дейтвие в Листе1, из листа2 - меня выкидывает на Лист1(типа для просмотра резульата макроса). Мне же надо оставаться в листе2. В принципе дописал внизу макроса строчки
Sheets("Лист2").Select 'Лист2
Но в этом случае он летит на лист2, и кокда я выполняю макрос из Листа1.
Подозреваю, что надо дописать чтото, типа "лететь на лист2, если лист1 неактивен", но по неопытности не знаю, как это сделать. Подскажите пожайлуста
Автор: USERJT
Дата сообщения: 17.09.2008 18:41
не получилось пишит : run-Time error 438
Что делать ?
Ругается как поняла на : If Range("A" & i).Interior = 6 Then ' для желтого цвета
Автор: SERGE_BLIZNUK
Дата сообщения: 17.09.2008 19:04
USERJT
а если исправить на
If Range("A" & i).Interior.ColorIndex = 6 Then ' для желтого цвета
??



Добавлено:
Oyger

Цитата:
Эксель не работает не с открытыми книгами. Так что она должна открываться

не совсем так...
есть хитрый метод (я прочитал о нём то ли на planetaExcel, то ли на Programmersforum)

если задать в ячейке формулу вида:
= "='" & myPath & "[" & myName & "]Лист1'!$A$1"
Где myPath - полный путь до файл
а myName - имя xls файла

то в данной ячейке появится значение из ячейки A1 из "закрытого" файла... :-)
Разумеется, Excel сам как-то хитро эти файлы открывает, но, главное, наружу это не проявляется...

потом, если ссылки на книги не нужны, можно заменить ячейки их значениями
(например, так: ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value)

ознакомится с подобным подходом можно, например, в решении от SAS:
вот здесь



Solenaja
к сожалению, много читал на форумах, что в Excel 2007 MS немного изменили методы и объектную модель.. поэтому кое-что не работает..
и ещё я не понял - под Excel 2003 задача Ваша решена?
Автор: Pravoved90
Дата сообщения: 17.09.2008 19:21
q1wed

Цитата:
Range("Лист1!E6:G6").Copy
Range("Лист1!H6").PasteSpecial

Действительно, работает и даже с других страниц, и так ка наддо))) Как-то я упустил этот момент...ОГРОМНАЯ ТЕБЕ БЛАГОДАРНОСТЬ ЗА ПОМОЩЬ И ТЕРПЕНИЕ, сам бы до зимы все это искал..)
Пошел копаться дальше
Автор: CEMEH
Дата сообщения: 17.09.2008 21:31
ВОПРОС.

А можно заставить VBA запускать Outlook Express? Т.е. используя исходные данные адрес, тема, содержание отправить письмо?
Автор: Solenaja
Дата сообщения: 17.09.2008 23:35
SERGE_BLIZNUK
да, под 2003 скрипт от MaximuS G работает (благо 2003 есть на серваке)
единственное выгружает в каталог по умолчанию, тот что в настройках Excel
Автор: Oyger
Дата сообщения: 18.09.2008 00:06
SERGE_BLIZNUK

Цитата:
есть хитрый метод
если задать в ячейке формулу вида:
= "='" & myPath & "[" & myName & "]Лист1'!$A$1"
Где myPath - полный путь до файл
а myName - имя xls файла

Спорно...
Когда ты вставляешь ссылку на другую книгу, это приводит к тому, что эксель обрабатывает файл, находит там код со значением нужной ячейки и вставляет ее в твою книгу. А это, фактически, открытие книги, только без отображения (на чем, собственно и экономится время: эксель просто ищет код ячейки и берет только ее значение. Форматы, примечания, шрифты - все это опускается)

Добавлено:
Pravoved90
q1wed

Цитата:
Range("Лист1!E6:G6").Copy
Range("Лист1!H6").PasteSpecial

А я обычно использую такой вид записи:
Sheets("Лист1").Range("E6:G6").Copy
Sheets("Лист1").Range("H6").PasteSpecial
Писать немного больше, но читать удобнее. Да и работать так проще. Хотя, это все для меня...


Добавлено:
CEMEH
Теоретически, можно все. Но цена вопроса слишком высока.
Мое мнение: Оутлук Экспресс не является Офисным приложением (написан совсем другой компанией). Штатные команда в нем не действуют. Можно извратится и работать, ссылаясь на окна и обработку событий, но... жалко мне тебя, CEMEH.
Могу ошибаться - Оутлука Экспресса под рукой не имею. Может, если его и поставить, появится возможность подключить его библиотеку... ???
Чем не устраивает штатный Оутлук? Могу помочь с кодом для штатного...
Автор: dneprcomp
Дата сообщения: 18.09.2008 05:23
CEMEH
http://www.rondebruin.nl/sendmail.htm
http://www.rondebruin.nl/tips.htm
http://spreadsheetpage.com/index.php/tip/sending_personalized_email_from_excel/
http://www.vbaexpress.com/kb/getarticle.php?kb_id=910
http://www.google.com/search?hl=en&q=Outlook+Express+vba&start=0&sa=N
Автор: ZhanR
Дата сообщения: 18.09.2008 08:17
как можно заставить функцию UDF, которую вписываю в ячейке, чтобы она меняла свойства ячейки (к примеру font), т.е. в принципе если эту функцию вызывать не из ячейки, а с какого-нить sub, то все отрабатывает. Мне нужно это для того чтобы функция суммировала некоторый диапазон данных (имеются условия к суммируемым данным), но если если в сумму попадают суммы с некоторыми признаками, то в зависимости от этих признаков текст в ячейке был bold или italic или bold+italic...
Автор: MaximuS G
Дата сообщения: 18.09.2008 08:38
WowGun

Цитата:
Dim Arr(1 To 12) и For row = 7 To 19


Не пойму, так что здесь не так ?
Ведь в массив Arr(i) = Cells(row, 3).Value записуется значение ячейки под номера переменной i , а она и будет от 1 до 12, 19-7 = 12 ???
Если не тяжело объясните, потому что раньше все получалось

Добавлено:
mic21

Вот код, хотя не понимаю, неужиле так сложно открыть 6 книг и просто копировать
Он получаеться достаточно длинный, может быть кто то найдет способ сократить...

Код:
Sub copyTest()
Dim CheckRows, CheckRowsT As String

ChDir "C:\Documents and Settings\.." ' так вам надо будет записать 6 раз,
Workbooks.Open Filename:= _ каждый раз меняя название книги
"C:\Documents and Settings\...\1_файл.xls" все книги будут открыты сразу


Windows("1_файл.xls").Activate 'активируем первую и лист
Sheets("Лист3").Activate

For i = 2 To 100 'находим последннюю строчку
If Cells(i, 2) = "" Then
CheckRows = i - 1
Exit For
End If
Next

Range(Cells(2, 1), Cells(CheckRows, 4)).Copy 'копируем

Windows("Итоги.xls").Activate 'вставляем
Sheets("Лист3").Activate
Range("A2").Select
ActiveSheet.Paste

Windows("1_файл.xls").Activate 'это по желанию, можна
ActiveWorkbook.Close закрыть книгу с которой копи


Windows("2_файл.xls").Activate 'теперь все тоже самое по
Sheets("Лист3").Activate 'по остальным
For i = 2 To 100
If Cells(i, 2) = "" Then
CheckRows = i - 1
Exit For
End If
Next

Range(Cells(2, 1), Cells(CheckRows, 4)).Copy
Windows("Итоги.xls").Activate
Sheets("Лист3").Activate

For i = 2 To 100
If Cells(i, 2) = "" Then
CheckRowsT = i
Exit For
End If
Next

Range("A" + CheckRowsT).Select
ActiveSheet.Paste

... ну до конца уже допишите сами, все одинаково, только меняйте название книг

End Sub
Автор: WowGun
Дата сообщения: 18.09.2008 10:01
MaximuS G
19-7 = 12 ???
НЕА ...
считаем 7 это раз, 8 это 2, 9 это 3 ... 19 это 13 :u)
Автор: MaximuS G
Дата сообщения: 18.09.2008 10:06
WowGun
ОК но я пробовал и 20, и (1 to 13), и вообще без указания количества arr(), все равно не работает ... а у Вас все работает ?

Добавлено:
М-да, вообщем заработало ... насколько я понял обязательно в такой конструкции указывать количество элементов в массиве (1 to 13)... вот тогда вопрос, например я укажу верхнюю границу 1000, а елементов будет 100, какие значения будут у остальных?..скорее всего вообще ни каких?
Автор: Pravoved90
Дата сообщения: 18.09.2008 12:14
Добрый день, уважаемые специалисты. Подскажите, как прописать простую строку в макросе:
В листе1 есть ряд столбиков с данными. Нужно, чтобы при добавлении еще одного идентичного столбика он сразу перемещался в правый край и становился за последним до него столбиком.
Заранее признателен за помощь.
Автор: MaximuS G
Дата сообщения: 18.09.2008 13:26
Pravoved90
Можно по-подробнее... я вообще не понимаю
Какой столбик, каким образом добавлять, идентичного по каким критериям ?
И как это за последним до него столбиком?
Скиньте ссылку на пример...
Автор: Pravoved90
Дата сообщения: 18.09.2008 13:28
MaximuS G
Допустим есть Лист1 и Лист2. Есть столбики одинаковых параметров и размеров, но с разными цифрами(хотя, думаю, это не суть важно). В листе2 эти столбики идут один за другим слева-направо. Хочу сделать так, чтобы при копировании Такого же столбика из листа1 в ячейку, к примеру А1 Листа2, столбик копировался дальше вправо и становился следом за последним столбиком Листа2. Потом следующий при копировании становился уже за новым последним и тд. Общая часть макроса понятна, а вот как написать саму функцию "вставить за последний столбик" за неимением опыта не в представляю...

Добавлено:
Сделал маленький образец
http://rapidshare.com/files/146274232/__1054___1073___1088___1072___1079___1077___1094__pravoved90.xls.html
Условие: Из листа ИТОГ копируется столбик H6:J9 в лист АРХИВ. В листе АРХИВ уже находятся ранее полученные столбики-итоги с названиям Итог1, Итог2 и тд.
Задача. При копирование нового столбика из листа ИТОГ в ячейку, к примеру А8 лиса АРХИВ, столбик автоматом копировался и становился за последним из предыдущих столбиков. При новом копировании,уже новый столбик становился за уже новым последним столбиком, и тд.
Автор: ZhanR
Дата сообщения: 18.09.2008 14:03

Цитата:
как можно заставить функцию UDF, которую вписываю в ячейке, чтобы она меняла свойства ячейки (к примеру font), т.е. в принципе если эту функцию вызывать не из ячейки, а с какого-нить sub, то все отрабатывает. Мне нужно это для того чтобы функция суммировала некоторый диапазон данных (имеются условия к суммируемым данным), но если если в сумму попадают суммы с некоторыми признаками, то в зависимости от этих признаков текст в ячейке был bold или italic или bold+italic...
Автор: Oyger
Дата сообщения: 18.09.2008 14:41
Pravoved90
Во гигант мысли =) А зачем ты вставляешь в столбец "А" только для того, чтобы он сразу перемещался в последний столбец (к примеру "R").
Перед копированием ищи сразу последний пустой столбец и вставляй сразу туда.
Автор: Pravoved90
Дата сообщения: 18.09.2008 14:54

Цитата:
А зачем ты вставляешь в столбец "А"

Это, чтобы видеть, какие данные были последними.+ возможно над ними проводить операции.

Цитата:
Перед копированием ищи сразу последний пустой столбец и вставляй сразу туда.

Можно и такой вариант(конечно автоматом), только скажите - как?...)))

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.