помогите переделать макрос для екселя

Программирование на Visual Basic for Applications
abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

помогите переделать макрос для екселя

Сообщение abracadabra » 06.02.2006 (Пн) 18:17

Данный макрос выполняет следующее:
На листе Ексель есть несколько строк со значениями.
Если в 13 столбце какой-нибудь строки присутствует "++", то всю строку нужно выделить красным цветом
Если в 13 столбце какой-нибудь строки присутствует "--", то всю строку нужно выделить синим цветом.
Как переделать макрос, чтобы там не было конструкций GoTo?
Или написать заново?

Sub красный_синий()

a = "++"
c = 3
GoTo 6

5
a = "--"
c = 5

6
Cells(65536, 256) = a
Cells(1, 1).Activate


10
If ActiveCell.Row = 65536 Then GoTo 20
Cells.Find(What:=a, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Rows(ActiveCell.Row).Interior.ColorIndex = c
GoTo 10

20
If c = 3 Then GoTo 5
Cells(65536, 256) = ""
Cells(1, 1).Activate
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: помогите переделать макрос для екселя

Сообщение alibek » 06.02.2006 (Пн) 18:22

abracadabra писал(а):Или написать заново?

Да.

Любые GoTo можно реализовать с помощью Select Case и циклов (Do...Loop, For...Next).
А данный код, похоже, составлял какой-то приколист.
Lasciate ogni speranza, voi ch'entrate.

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 07.02.2006 (Вт) 11:38

приколист я, школу просто вспоминал и только VBA осваивал :)

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 07.02.2006 (Вт) 12:59

Alibek
Спасибо. Переделал, слава Богу, с помощью фор-некст.
Есть ещё одна задачка. Нужно прочитать *.ini файл из VBA в Екселе.
Я уже задавал этот вопрос здесь на форуме и получил список 5 апи-функций, а как их использовать в процедуре ВБА так и не докопался. Не могли бы Вы хотя бы приблизительно написать, как это должно выглядеть в виде процедуры ВБА, т.е. использование функции Вин-апи.

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 07.02.2006 (Вт) 13:36

а если просто этот файл ini открыть в Excel а потом уже сравнивать его пересравнивать?

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 07.02.2006 (Вт) 18:19

я за, а как так можно. у тебя есть код?

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 07.02.2006 (Вт) 18:21

просто надо понять, у тебя есть файл ini а с чем тебе его сравнивать надо, с другим ини или с чем?

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 08.02.2006 (Ср) 13:13

Значит, задача такая.
Есть ини такой, к примеру:
[BLUTBILD]
GOT=1
GGT=2
[URIN]
HJJ=3
LKJH=4

В скобках - название группы параметров
дальше - параметры, цифры - это номер строки в екселе,
чтоб их выводить последовательно.
1.Нужно посмотреть в ини файл, прочесть первый параметр, номер строки,
2.потом заглянуть в некую программу (с базой данных), посмотреть, есть ли
там параметр и вывести его вопределённую строку Екселя.
Но второй пункт мне пока не нужен.
Для простоты, представим, что эти параметры находятся не в другой программе, а на другом листе ексель.
Главное - это как прочесть номер параметра и номер строки в ини-файле, и хотя бы вывести его в Debug.Print.

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 13:56

У меня есть апишные функции.

1.Public Declare Function WriteProfileSection Lib "kernel32" Alias "WriteProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String) As Long
2.Public Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
3.Public Declare Function GetProfileInt Lib "kernel32" Alias "GetProfileIntA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal nDefault As Long) As Long
4.Public Declare Function GetProfileSection Lib "kernel32" Alias "GetProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
5.Public Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long

Как теперь открыть из Екселя ини-файл и прочитать первую строчку
GOT=1

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 09.02.2006 (Чт) 14:14

ну ты его открой просто сначала, типо:

Workbooks.OpenText Filename:= _
"C:\Documents and Settings\1\XXX.INI", Origin:=1251, StartRow _
:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True

потом, если он у тебя во второй строчке, то

y = Cells(2, 1)
x = Right$(y, Len(y) - InStrRev(y, "="))

а если не во второй, то сначала найди его и кинь в игрик, икс и будет твое значение GOT
Изображение

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 15:10

На TrailingMinusNumbers:= написало "Именованный аргумент не найден"

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 15:16

Правда, удалось открыть без аргументов и прочитать, но на InStrRev ругается "Процедура саб или фанкшн не определена".
Строчка x = Right$(y, Len(y) - InStrRev(y, "=")) не работает.
Хотя спасибо конечно что уже открывается, и то хорошо.

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 15:18

А как ещё сделать, чтоб на листе Ексель содержимое ини-файла не визуально не отображалось?

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 09.02.2006 (Чт) 15:19

запиши макрос открытия это инишки и возьми его, это я так написал в привесок, вообще мы считали что он уже открыт :)
Изображение

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 09.02.2006 (Чт) 15:20

почему не работает то, должна работать, просто на x и игрик может ругается?
Изображение

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 15:36

Maks the best писал(а):запиши макрос открытия это инишки и возьми его, это я так написал в привесок, вообще мы считали что он уже открыт :)

это как?

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 15:38

Maks the best писал(а):почему не работает то, должна работать, просто на x и игрик может ругается?

на игрик не ругается.
ругается на х, почему-то на InStrRev

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 09.02.2006 (Чт) 15:57

это как?


это как макросы записываются, ты же знаешь, включаешь запись и делаешь что надо, в данном случае открываешь свой файл, потом стом, мотор, снято!

а по поводу
на игрик не ругается.
ругается на х, почему-то на InStrRev


не знаю, должно работать если он у тебя ее как функцию не понимает, тогда не знаю проверь
попробуй вместо игриков ячейку сразу прописать типо:
Код: Выделить всё
Right$(Cells(2, 1), Len(Cells(2, 1)) - InStrRev(Cells(2, 1), "="))
Изображение

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 16:27

не, я имею в виду, чтоб єтот ини на листе ексель не отображался, т.к. у меня на листе ексель другая фигня должна присутствовать.

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 09.02.2006 (Чт) 16:34

ну ты открой файл и скрой сразу этот лист или даже открой, забей массив данными оттуда и закрой сразу
Изображение

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 09.02.2006 (Чт) 17:33

А можешь код подкинуть?

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 09.02.2006 (Чт) 18:17

вообще если у тебя один всего там параметр GOT и при открытии файла ini все параметры ложатся в первый столбец с первой по 10-ю строчку допустим то:

объявляешь перед кодом переменные:
Public r, got As Integer

далее твоя sub xxx ()

открываешь файл ini (как хочешь)
потом:

For r=1 to 10
If Left$(Cells(r,1), 4)="GOT=" then
got=Right$(Cells(r,1), Len(Cells(r,1)) - 4)
End if
next r

закрываешь файл ini (как хочешь)

переменная got и будет значением твоего параметра
Изображение

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 10.02.2006 (Пт) 12:49

Макс, можешь конкретно написать код закрытия файла и всё. :twisted:
Крокодил, крокодю и буду крокодить!

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 10.02.2006 (Пт) 13:00

если он открыт и его окно активно:
ActiveWorkbook.Close

если активно другое то:
Workbooks("XXX.INI").Close

p.s. я тебе все писал про открытие и закрытие файла INI как книги из Excel, а не способ достачи информации из INI через апишные функции... поэтому ты наверное не так понял...
Изображение

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 10.02.2006 (Пт) 13:40

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

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 10.02.2006 (Пт) 13:47

Последний вопрос:
Как из GGT=1 запузырить в одну переменную GGT, в другую 1?
Крокодил, крокодю и буду крокодить!

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 10.02.2006 (Пт) 13:48

GGT=1 в данном случае находится в ячейке А2
Крокодил, крокодю и буду крокодить!

Maks the best
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 09.06.2005 (Чт) 12:34
Откуда: Санкт-Петербург

Сообщение Maks the best » 10.02.2006 (Пт) 14:01

Left$(Cells(2,1), 3) - это твой GOT
Right$(Cells(2,1), Len(Cells(2,1)) - 4) - это твоя единица
Изображение


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 89

    TopList  
cron