|
|
|
Вопрос по 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)
|
|||
|
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 так прокатик для матеаматики
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |