Имя: Пароль:
IT
 
Вопрос по VBA
0 Некуций
 
02.08.06
13:39
Подскажите функцию перехода на следущую итерацию цикла до завершения текущей итерации.
1 Волшебник
 
02.08.06
13:40
continue
2 skunk
 
02.08.06
13:41
эт типа как 1С continue
3 Некуций
 
02.08.06
13:42
В VBA вроде нет continue, это делфи-паскаль.
4 skunk
 
02.08.06
13:52
тогда наверное next
5 Pivtsaev
 
02.08.06
13:55
For I = 1 To 10
   For J = 1 To 10
       For K = 1 To 10
           ...
       Next K
   Next J
Next I
6 Некуций
 
02.08.06
14:04
(4)
Блин, такой специалист и такая глупость.
7 skunk
 
02.08.06
14:06
я не специалист
8 Некуций
 
02.08.06
14:08
(5)
Бред.

Я сделал так. Ввел новую переменную, которая после каждой итерации равнялась 0, но при выполнения условия внутри операции она равнялась 1. Перед этим условием была проверка значения этой переменной. В результате, если условие один раз срабатывало внутри итерации, второй раз оно сработать не могло. Может глупо, но работает.
9 skunk
 
02.08.06
14:09
не совсем понятна цель изврата
10 MAG
 
02.08.06
14:09
GOTO
11 АдамДжанавар
 
02.08.06
14:10
(0) exit for
12 Некуций
 
02.08.06
14:15
Да, наверное не сомсем удачный подход придумал. Может другой предложите. У меня есть файл со строками типа
  21    23   139 Горнев Александр Владимирович       10886.00 01/06/2006
  22    23   140 Гранова Татьяна Олеговна            12020.33 01/06/2006
  23     3   118 Гручин Тимур Валерьевич             11884.60 01/06/2006
надо из него вычленить имя и сумму. Может более удачный алгоритм предложите?
13 Некуций
 
02.08.06
14:16
+(12)файл тхт
14 skunk
 
02.08.06
14:19
на vba?
15 Некуций
 
02.08.06
14:20
(14)
Желательно да. А разве есть более удобная система для такой цели?
16 Rednyrg
 
02.08.06
14:21
(12) Разделено то чем? пробелы? таб?
17 Rednyrg
 
02.08.06
14:21
+(16) Чистый Vba или Vba Excel например?
18 Некуций
 
02.08.06
14:22
(16)
Пробелы.
19 Некуций
 
02.08.06
14:22
(17)
Excel разумеется
20 skunk
 
02.08.06
14:22
я же назню что и куда ты тащищь... может 1С
21 Rednyrg
 
02.08.06
14:22
(18) А как ты поймешь где следующее поле начинается тогда в случае ФИО например?
22 Rednyrg
 
02.08.06
14:24
(19) В экселе есть такое:
OpenText Method
               

Loads and parses a text file as a new workbook with a single sheet that contains the parsed text-file data.

Syntax

expression.OpenText(Filename, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space, Other, OtherChar, FieldInfo, DecimalSeparator, ThousandsSeparator)

expression   Required. An expression that returns a Workbooks object.

Filename   Required String. Specifies the file name of the text file to be opened and parsed.

Origin   Optional Variant. Specifies the origin of the text file. Can be one of the following XlPlatform constants: xlMacintosh, xlWindows, or xlMSDOS. If this argument is omitted, the method uses the current setting of the File Origin option in the Text Import Wizard.

StartRow   Optional Variant. The row number at which to start parsing text. The default value is 1.

DataType   Optional Variant. Specifies the column format of the data in the file. Can be one of the following XlTextParsingType constants: xlDelimited or xlFixedWidth. The default value is xlDelimited.

TextQualifier   Optional Variant. Specifies the text qualifier. Can be one of the following XlTextQualifier constants: xlTextQualifierDoubleQuote, xlTextQualifierSingleQuote, or xlTextQualifierNone. The default value is xlTextQualifierDoubleQuote.

ConsecutiveDelimiter   Optional Variant. True to have consecutive delimiters considered one delimiter. The default is False.

Tab   Optional Variant. True to have the tab character be the delimiter (DataType must be xlDelimited). The default value is False.

Semicolon   Optional Variant. True to have the semicolon character be the delimiter (DataType must be xlDelimited). The default value is False.

Comma   Optional Variant. True to have the comma character be the delimiter (DataType must be xlDelimited). The default value is False.

Space   Optional Variant. True to have the space character be the delimiter (DataType must be xlDelimited). The default value is False.

Other   Optional Variant. True to have the character specified by the OtherChar argument be the delimiter (DataType must be xlDelimited). The default value is False.

OtherChar   Optional Variant (required if Other is True). Specifies the delimiter character when Other is True. If more than one character is specified, only the first character of the string is used; the remaining characters are ignored.

FieldInfo   Optional Variant. An array containing parse information for individual columns of data. The interpretation depends on the value of DataType.

When the data is delimited, this argument is an array of two-element arrays, with each two-element array specifying the conversion options for a particular column. The first element is the column number (1-based), and the second element is one of the xlColumnDataType constants listed in the following table, specifying how the column is parsed.

Constant Description
xlGeneralFormat General
xlTextFormat Text
xlMDYFormat MDY date
xlDMYFormat DMY date
xlYMDFormat YMD date
xlMYDFormat MYD date
xlDYMFormat DYM date
xlYDMFormat YDM date
xlEMDFormat EMD date
xlSkipColumn Skip column
23 skunk
 
02.08.06
14:24
(21)скорее всего ФИО из трех слов ... всегда
24 Некуций
 
02.08.06
14:25
Вот что у меня было. Проблема только в том, что в vba дробь определяется запятой, а не точкой. Осталось доделать только это. Однако наверняка есть более рациональный вариант, чем у меня.
For i = 9 To lastrow1
dlin = Len(Mid(EP1List.Cells(i, 1), 12, 100)) - 10
famsum = Mid(EP1List.Cells(i, 1), 12, dlin)
famsum = Trim(famsum)
If IsNumeric(Left(famsum, 1)) = True Then famsum = Mid(famsum, 2, 100)
If IsNumeric(Left(famsum, 1)) = True Then famsum = Mid(famsum, 2, 100)
If IsNumeric(Left(famsum, 1)) = True Then famsum = Mid(famsum, 2, 100)
For k = 4 To 13
If x <> 1 Then
If Left(Right(famsum, k), 1) = " " Then
fami(i) = Trim(Mid(famsum, 1, dlin - k))
sumi(i) = Val(Trim(Mid(famsum, dlin - k, 100)))
x = 1
End If
End If
Next k
x = 0
MsgBox fami(i) + Trim(sumi(i))
Next i
25 Rednyrg
 
02.08.06
14:25
(23) Просто в случае нормальных разделителей это всего лишь один метод .OpenText
26 Rednyrg
 
02.08.06
14:27
(24) Так у тебя данные в формате (12) в другом листе в одной колонке что ли?
27 DGorgoN
 
02.08.06
14:28
Долгое время считалось, что бит неделим. Но советские учёные...
28 DGorgoN
 
02.08.06
14:28
упс, не сюда..
29 Rednyrg
 
02.08.06
14:28
(27) зажег!
30 Некуций
 
02.08.06
14:28
(25)
У меня не нормальные разделители, колонки отрывают часть других колонок при открытии файла с разбиением на колонки.

(26)
да
31 Rednyrg
 
02.08.06
14:29
(30)1 -- что открываешь то перед этим? текстовый файл? сразу юзай opentext тогда
32 Rednyrg
 
02.08.06
14:32
+(31) Пойми что твоя проблема возможно одной строчкой кода решается
Workbooks.OpenText filename:="DATA.TXT", dataType:=xlDelimited, tab:=True
33 smaharbA
 
02.08.06
15:03
Некуций - я тебе сделаю поиск ФИО и выделение, хоть во всем файле сразу, хоть построчно (на "нормированность" файла начхать)
34 Женя Женя
 
02.08.06
15:05
Запускаю с помощью такого скрипта vb 2 сеанса под разными пользователями.

Надо между ними поставить задержку в 10 секунд. Подскажите, как это можно сделать?

set Locator=CreateObject("WbemScripting.SWbemLocator")
set Service=Locator.ConnectServer()
set StartUp=Service.Get("Win32_ProcessStartup")
set Process = Service.Get("Win32_Process")
Set method = process.Methods_("Create")
Set inParam = method.inParameters.SpawnInstance_()
inParam.CommandLine = "C:\Program Files\1cv8\bin\1cv8.exe enterprise /SInt-1c\Intalev /n""Пользователь1"" /pПароль1"
inParam.ProcessStartupInformation=StartUp
Set outParam = process.ExecMethod_("Create", inParam)

rem тут задержка

set Locator=CreateObject("WbemScripting.SWbemLocator")
set Service=Locator.ConnectServer()
set StartUp=Service.Get("Win32_ProcessStartup")
set Process = Service.Get("Win32_Process")
Set method = process.Methods_("Create")
Set inParam = method.inParameters.SpawnInstance_()
inParam.CommandLine = "C:\Program Files\1cv8\bin\1cv8.exe enterprise /SInt-1c\Intalev /n""Пользователь2"" /pПароль2"
inParam.ProcessStartupInformation=StartUp
Set outParam = process.ExecMethod_("Create", inParam)
35 Некуций
 
02.08.06
15:05
(33)
Так сделай, я не против. Мне надо ФИО и сумму. Формат файла я выложил. А сам пока быги вылавливаю. Чето не идет.
36 Некуций
 
02.08.06
15:06
(34)Издеваешься?
37 Женя Женя
 
02.08.06
15:07
(36) Нет, пока только спрашиваю.
38 smaharbA
 
02.08.06
15:07
(34) WScript.Sleep 10000
(35) Поздно вечерком, счас некогда *никсами занят (будь они неладны)
39 smaharbA
 
02.08.06
15:08
(37) А нафига так сложно ? Тенбе что нужно кучу параметров процесса знать(да и нафига) ?
40 Некуций
 
02.08.06
15:09
(38)
В новое место уже перешел?
41 Rednyrg
 
02.08.06
15:09
(35) Попробуй так при открытии текст файла
Workbooks.OpenText filename:="DATA.TXT", dataType:=xlDelimited, other:=True, otherChar:=" "
потом три колонки с ФИО в одну сольешь ;-)
42 smaharbA
 
02.08.06
15:10
(40) Не, на двух пока разрываюсь
43 Некуций
 
02.08.06
15:10
Вечерком мне не надо, я сам за 30 минут доделаю.
44 smaharbA
 
02.08.06
15:11
(43) Делай через RegExp все просто будет - пара-тройка строк, хоть целиком из всего текстовика, хоть построчно
45 smaharbA
 
02.08.06
15:12
А следующая итерация см. (10)
46 Некуций
 
02.08.06
15:13
(45) goto отстой
47 Женя Женя
 
02.08.06
15:13
(38) Спасибо.
48 smaharbA
 
02.08.06
15:15
(46) Зря ты так в ВБ это очень не простой оператор
49 Некуций
 
02.08.06
15:17
(48)отслеживать алгоритм с использованием goto сложновато, особенно если он в цикле второго порядка.
50 774816
 
02.08.06
15:52
открытие файла и чтение данных по строчно

Dim LinesFromFile, NextLine As String
FileNum = 1
pathname = "c:\yops.txt"

Open pathname For Input As FileNum
Do Until EOF(FileNum)
  Line Input #FileNum, NextLine
' в этом цикле можно отфильтровать данные по строчно используя переменную NextLine
  LinesFromFile = LinesFromFile + NextLine + Chr(13) + Chr(10)
Loop

Close FileNum
MsgBox LinesFromFile ' эта переменна выводит объеденненые строки т.е. весь текст




(24) тест=Replace(тест, ",",".") меняет запятую на точку
51 smaharbA
 
03.08.06
00:00
(50) А за один присест по строкам раскидать слабо (без цикла) ? :)
52 Некуций
 
03.08.06
06:53
Помогите понять ошибку. Несколько раз запускал-работало. Потом то ли случайно, толи как, работать вдруг перестало. Выдается ошибка "invalid procedure call or argument" в строке famsum = Mid(EP1List.Cells(i, 1), 12, dlin)

Вот весь текст
Private Sub CommandButton7_Click()
Set fso = CreateObject("scripting.filesystemobject")
Set ep1 = Workbooks.Open(Filename:=Cells(22, 3).Value)
Set ep2 = Workbooks.Open(Filename:=Cells(24, 3).Value)
Set ep3 = Workbooks.Add

Dim fami(500)
Dim sumi(500)

epname1 = fso.GetFileName(Cells(22, 3).Value)
epname2 = fso.GetFileName(Cells(24, 3).Value)


Set EP1List = ep1.Sheets(1)
Set EP2List = ep2.Sheets(1)
Set EP3List = ep3.Sheets(1)

lastrow1 = EP1List.Cells.SpecialCells(xlCellTypeLastCell).Row
lastrow2 = EP2List.Cells.SpecialCells(xlCellTypeLastCell).Row
EP3List.Activate


For i = 9 To lastrow1
dlin = Len(Mid(EP1List.Cells(i, 1), 12, 100)) - 10
famsum = Mid(EP1List.Cells(i, 1), 12, dlin)
famsum = Trim(famsum)
If IsNumeric(Left(famsum, 1)) = True Then famsum = Mid(famsum, 2, 100)
If IsNumeric(Left(famsum, 1)) = True Then famsum = Mid(famsum, 2, 100)
If IsNumeric(Left(famsum, 1)) = True Then famsum = Mid(famsum, 2, 100)
dlin2 = Len(famsum)
For k = 4 To 13
If Left(Right(famsum, k), 1) = " " Then
fami(i) = Trim(Mid(famsum, 1, dlin2 - k))
sumi(i) = Val(Trim(Mid(famsum, dlin2 - k + 1, 100)))

End If
Next k
Next i

End Sub
53 Некуций
 
03.08.06
07:12
Блин, дебилизм. У меня длина файла -123 строки. Прога глючит на 124 стоке, причем у меня явно указано, что надо делать до последней строки. 124 строка пустая, какого х прога на нее залазит?
54 774816
 
03.08.06
07:44
попробуй так
For i = 9 To lastrow1 -1
55 Некуций
 
03.08.06
07:46
(54)Я так и сделал, работает. Но все же.
56 774816
 
03.08.06
07:51
выведи количество перед циклом
MsgBox  lastrow1
что выводит ?
57 smaharbA
 
03.08.06
08:09
//*******************************************
Процедура Сформировать()
   Регуляр=СоздатьОбъект("VBScript.RegExp");
   Регуляр2=СоздатьОбъект("VBScript.RegExp");
   Стр="21    23   139 Горнев Александр Владимирович       10886.00 01/06/2006
   |22    23   140 Гранова Татьяна Олеговна            12020.33 01/06/2006
   |23     3   118 Гручин Тимур Валерьевич             11884.60 01/06/2006
   |";
   Регуляр.Pattern="\W+?\d+?.\d\d\s+?\d\d/\d\d/\d\d\d\d[\n\r]";
   Регуляр.IgnoreCase=-1;
   Регуляр.Global=-1;
   Результаты = Регуляр.Execute(Стр);
   Для к=0 По Результаты.Count-1 Цикл
       Сообщить(Результаты.item(к).value);
   КонецЦикла;
КонецПроцедуры
///
Можно шаблон так составить, что сразу разобьет на составные
58 Некуций
 
03.08.06
08:17
(57)
Спасибо конечно, но у меня мой вариант уже работает, менять его не охота.
59 smaharbA
 
03.08.06
08:17
+(57)

//*******************************************
Процедура Сформировать()
   Регуляр=СоздатьОбъект("VBScript.RegExp");
   Регуляр2=СоздатьОбъект("VBScript.RegExp");
   Стр="21    23   139 Горнев Александр Владимирович       10886.00 01/06/2006
   |22    23   140 Гранова Татьяна Олеговна            12020.33 01/06/2006
   |23     3   118 Гручин Тимур Валерьевич             11884.60 01/06/2006
   |";
   Регуляр.Pattern="(\W+)?(\d+?.\d\d)\s+?(\d\d/\d\d/\d\d\d\d)[\n\r]";
   Регуляр.IgnoreCase=-1;
   Регуляр.Global=-1;
   Результаты = Регуляр.Execute(Стр);
   Для к=0 По Результаты.Count-1 Цикл
       Сообщить(Результаты.item(к).SubMatches.item(0));
       Сообщить(Результаты.item(к).SubMatches.item(1));
       Сообщить(Результаты.item(к).SubMatches.item(2));
   КонецЦикла;
КонецПроцедуры
60 smaharbA
 
03.08.06
08:18
(58) см (59) - это "моментально", можно еще подрихтовать шаблон, тогда будет вообще безразницы структура файла...
61 Некуций
 
03.08.06
08:19
(59)Это че, в 1с чтоли?
62 smaharbA
 
03.08.06
08:20
+(60)(59) если поменять / на [/-.] то дату будет парсить в любом виде
01/06/2006
01-06-2006
01.06.2006
63 smaharbA
 
03.08.06
08:20
(61) Да, в екселе тоже самое, тока где надо set поставь
64 Некуций
 
03.08.06
08:27
(63)Подскажите лучше тут
Еще вопросик по Excel VBA
65 774816
 
03.08.06
08:30
(64) выложи пример как есть и как должно выглядеть
66 Некуций
 
03.08.06
08:32
(65)
Есть 100,05 и 100,5
Должно быть 100.05 и 100.50
67 774816
 
03.08.06
08:36
s = "100,5"
s = Format("100,05", "#0.00")
s = Replace(s, ",", ".")
68 774816
 
03.08.06
08:38
(67)но при этом результат получается строковым занчение
69 Некуций
 
03.08.06
08:39
(68)Все правильно, так и надо.
70 774816
 
03.08.06
08:40
(68) Val(s) * 2 так прокатик для матеаматики
Ошибка? Это не ошибка, это системная функция.