|
v7: Проверить пустое значение на бейсике | ☑ | ||
---|---|---|---|---|
0
Maximysis
19.11.12
✎
07:36
|
Всем доброго дня!
Сделал загрузку из экселя в документ. Теперь хочу его немного улучшить. надо проверять ячейку на пустоту, 1с7 пофиг(( я загружаю так: Эксель = СоздатьОбъект("Excel.Application"); Книга = Эксель.WorkBooks.Open(ИмяПути+ИмяВыбрФайла); Лист = Книга.WorkSheets(1); Значение = Лист.Cells(х, у).Value; Есть ли у Value метод проверки на пустое значение? кто бейсик знает посоветуйте... |
|||
1
ЧеловекДуши
19.11.12
✎
07:38
|
А причем тут 1С?
|
|||
2
ЧеловекДуши
19.11.12
✎
07:38
|
+ Мне тоже пофиг
|
|||
3
ЧеловекДуши
19.11.12
✎
07:39
|
+ Моё переменное = '' Вуаля
|
|||
4
ЧеловекДуши
19.11.12
✎
07:39
|
+ А так же
Моё переменное = Null Вуаля |
|||
5
Maximysis
19.11.12
✎
07:41
|
идея в проверке на nul на бейсике
если не 0 а nul то забью значение предопределенной строкой, а потом буду сравнивать. функция IsEmpty() вываливает ошибку, есть что другое?? |
|||
6
Maximysis
19.11.12
✎
07:42
|
ЧеловекДуши иди троль в другом месте
|
|||
7
КонецЦикла
19.11.12
✎
07:43
|
Если ПустоеЗначение(Значение) = 1
|
|||
8
Maximysis
19.11.12
✎
07:44
|
(7) для 1с7 одно и тоже "0" и "Null"
|
|||
9
КонецЦикла
19.11.12
✎
07:45
|
(8) Визуально что в ячейке находится?
Что-то не вкурю откуда у екселя null |
|||
10
ЧеловекДуши
19.11.12
✎
07:46
|
(6)И вам не болеть.
Nul or Null, да мне побоку. Смысл ты уловил. А по сути Value, в Екселе, всегда имеет текстовый тип. :) |
|||
11
ЧеловекДуши
19.11.12
✎
07:48
|
+(8) Сори не посмотрел.
Делай так Значение = СокрЛП(Лист.Cells(х, у).Value); И далее проверяй на Если ПустоеЗначение(Значение) = 1 |
|||
12
КонецЦикла
19.11.12
✎
07:51
|
(11) Ну-ка... что такого сделает СокрЛП() с пустой строкой?
Опустошит жыстачайчшым образом? |
|||
13
Maximysis
19.11.12
✎
07:57
|
в ячейке может ничего не находица а может и быть цифра нуль, проблема в том что 1с не понимает разница, а вот бейсик..
|
|||
14
Maximysis
19.11.12
✎
07:58
|
(12) ничего не даст как будет пустая строка так и обрежется пустая строка.
|
|||
15
Maximysis
19.11.12
✎
07:59
|
(11) ПустоеЗначение ему все ровно если будет 0 или Null
|
|||
16
Maximysis
19.11.12
✎
08:00
|
или ""
|
|||
17
Maximysis
19.11.12
✎
08:00
|
идея проверять до получения в 1С
|
|||
18
Maximysis
19.11.12
✎
08:01
|
кто нибудь так заморачивался с екселем?
|
|||
19
КонецЦикла
19.11.12
✎
08:01
|
Делай запрос к листу екселя, там что хочешь твори
Или засасывай в ТЗ и твори там Непонял нужен ноль или нет и вообще в чем проблема |
|||
20
ЧеловекДуши
19.11.12
✎
08:01
|
(15)Какая нуль? Ты же про 1С 7.7?
Чтение из екселе через ОЛЕ? Так тогда там всегда Строка. |
|||
21
ЧеловекДуши
19.11.12
✎
08:02
|
+(18)Биться как дятел об одно и то же место?
Нет, ты первый :) |
|||
22
ЧеловекДуши
19.11.12
✎
08:02
|
+(19)Ты ему еще намекни, как это сделать ;)
|
|||
23
Maximysis
19.11.12
✎
08:02
|
(19) повторяю 1С 7.7
|
|||
24
КонецЦикла
19.11.12
✎
08:02
|
ПустоеЗначение(0) = 1
ПустоеЗначение("") = 1 Это для справки |
|||
25
ЧеловекДуши
19.11.12
✎
08:03
|
(23)Черз АДО, можно запрашивать запросы :)
|
|||
26
Maximysis
19.11.12
✎
08:04
|
(24) спасиб кэП!!!
|
|||
27
КонецЦикла
19.11.12
✎
08:04
|
(23)
База =СоздатьОбъект("ODBCDatabase"); Если База.Соединение("DRIVER=Microsoft Excel Driver (*.xls); DBQ=" + СокрЛП(ИмяФайла)) = 0 Тогда Предупреждение("Ошибка открытия файла", 20); Возврат; КонецЕсли; RecordSetXLS =СоздатьОбъект("ODBCRecordSet"); RecordSetXLS.УстБД(База); ТекстЗапроса =" |select * |from [Лист1$A1:AZ] |"; ТЗ = RecordSetXLS.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
28
КонецЦикла
19.11.12
✎
08:04
|
(26) Фух...
|
|||
29
ЧеловекДуши
19.11.12
✎
08:04
|
+(24)Да просто у этого чудика в поле нарисовано "0", и если делать "СокрЛП(Value)", то всегда будет не пусто.
Ему надо преобразовать к нужному типу, типо ПустоеЗначение(Число(Value)) |
|||
30
ЧеловекДуши
19.11.12
✎
08:04
|
(28)Тоже так подумал, ТС, тяжёлый :)
|
|||
31
КонецЦикла
19.11.12
✎
08:05
|
(29) Да, число нормально
|
|||
32
КонецЦикла
19.11.12
✎
08:05
|
А может ему и не число нужно?
|
|||
33
ЧеловекДуши
19.11.12
✎
08:06
|
(31)Нет, не нормально, там же ОЛЕ. Все имеет тип "Строка"
|
|||
34
ЧеловекДуши
19.11.12
✎
08:06
|
(32)Может, но ДНК не излечимо :)
|
|||
35
Maximysis
19.11.12
✎
08:07
|
(29)Ты не человек души а троль низнаю чего там)
СокрЛП(Value) что за бред!! |
|||
36
ЧеловекДуши
19.11.12
✎
08:08
|
(35)Не груби, любитель НАТО, я не тролю в ветках про 1С, это святое.
|
|||
37
ЧеловекДуши
19.11.12
✎
08:10
|
(35)Держи...
Попытка db=CreateObject("ADODB.Connection"); db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR=1;IMEX=1"""; db.Open(); rs=CreateObject("ADODB.Recordset"); rs.ActiveConnection = db; rs.CursorType = 3; rs.LockType = 2; rs.Source = "Select * from [Лист1$]"; rs.Open(); Исключение Сообщить(ОписаниеОшибки(),"!"); СтатусВозврата(0); Возврат; КонецПопытки; rs.MoveFirst(); Пока rs.Eof()=0 Цикл НомерСтроки=НомерСтроки+1; Если СледСтрокаДанных=0 Тогда СледСтрокаДанных=ОпределитьСдвигЕкселя(СдвигИндекса,rs); rs.MoveNext(); Продолжить; ИначеЕсли Найти(ВРег(СокрЛП(rs.Fields(0+СдвигИндекса).Value)),"ИТОГ")>0 Тогда Прервать; ИначеЕсли СдвигИндекса>0 Тогда Если Найти(ВРег(СокрЛП(rs.Fields(0).Value)),"ИТОГ")>0 Тогда Прервать; Иначе ВсегоСтрокПоДокументу=ВсегоСтрокПоДокументу+1; КонецЕсли; Иначе ВсегоСтрокПоДокументу=ВсегоСтрокПоДокументу+1; КонецЕсли; |
|||
38
Maximysis
19.11.12
✎
08:10
|
повторяю ячейка может быть пустая,а может быть 0
но при получение в тексте будет пустое значение? Какое нато ты о чем???? |
|||
39
ЧеловекДуши
19.11.12
✎
08:11
|
+ Вот, еще
Процедура ЗаписатьДанныеЕксельЧерезADO(ТЗ_ДляЗаписи, ПутьИмяФайлаЕксель) //Попытка //ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьИмяФайлаЕксель)+";Extended Properties=""Excel 8.0;HDR=NO;""";//IMEX=1"""; //Создадим файл Ексель... Catalog = 0; Catalog = СоздатьОбъект("ADOX.Catalog"); Catalog.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьИмяФайлаЕксель)+";Extended Properties=""Excel 8.0;HDR=NO;""";//IMEX=1"""; // Создание новой таблицы Table = СоздатьОбъект("ADOX.Table"); // Имя таблицы Table.Name = "TestTable"; Для Ном = 1 По 5 Цикл // Создание новой колонки Column = 0; Column = СоздатьОбъект("ADOX.Column"); // Имя колонки Column.Name = "Col" + Ном; // Тип данных колонки Если Ном = 2 Тогда Column.Type = 202; // adVarWChar ИначеЕсли Ном = 3 Тогда Column.Type = 203; // adLongVarWChar Иначе Column.Type =5; // adDouble КонецЕсли; // Присоединение колонки к таблице Table.Columns.Append(Column); Column = 0; КонецЦикла; // Допустимые типы // adDouble = 5 Значение с плавающей точкой двойной точности // adDAte = 7 Дата // adCurrency = 6 Денежная сумма // adBoolean = 11 Булево // adVarWChar = 202 Символьная строка Unicode, заканчивающаяся NULL // adLongVarWChar = 203 Длинное строковое значение // Присоединение созданной таблицы (листа) к книге Excel Catalog.Tables.Append(Table); //Возврат; db=0; db=CreateObject("ADODB.Connection"); db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьИмяФайлаЕксель)+";Extended Properties=""Excel 8.0;HDR=NO;IMEX=0"""; //""";// db.Open(); //Узнаем количество таблиц и их наименований!!! тзТаблицы=0; тзТаблицы=СоздатьОбъект("ТаблицаЗначений"); тзТаблицы.НоваяКолонка("Table","Строка"); тзТаблицы.НоваяКолонка("Type","Строка"); Catalog = 0; Catalog = СоздатьОбъект("ADOX.Catalog"); Catalog.ActiveConnection = db; Для iCount = 0 По Catalog.Tables.Count-1 Цикл Если Catalog.Tables.Item(iCount).Type <> "VIEW" Тогда тзТаблицы.НоваяСтрока(); TableName = Catalog.Tables.Item(iCount).Name; TableName = Лев(TableName,Найти(TableName,"$")); тзТаблицы.Table = TableName; тзТаблицы.Type = Catalog.Tables.Item(iCount).Type; КонецЕсли; КонецЦикла; Если тзТаблицы.КоличествоСтрок()=0 Тогда db.Close(); Возврат; КонецЕсли; rs=0; rs=CreateObject("ADODB.Recordset"); шш1 = 1; Пока шш1 <= тзТаблицы.КоличествоСтрок() Цикл ИмяСтраницы = СокрЛП(тзТаблицы.ПолучитьЗначение(шш1,"Table")); Если ПустоеЗначение(ИмяСтраницы) = 1 Тогда тзТаблицы.УдалитьСтроку(шш1); Продолжить; КонецЕсли; //проверим таблицу!!! rs.ActiveConnection = db; rs.CursorType = 3; rs.LockType = 2; rs.Source = "Select * from ["+ИмяСтраницы+"]"; rs.Open(); Если rs.Fields.Count < 4 Тогда //это то что надо!!! Сообщить(""+Строка(rs.Fields.Count)); тзТаблицы.УдалитьСтроку(шш1); КонецЕсли; rs.Close(); шш1 = шш1 + 1; КонецЦикла; Если тзТаблицы.КоличествоСтрок()=0 Тогда db.Close(); Возврат; КонецЕсли; //Произведем выбор из списка, интерактивно!!! СпсМеню = 0; СпсМеню = СоздатьОбъект("СписокЗначений"); тзТаблицы.Выгрузить(СпсМеню,,,"Table"); Если СпсМеню.РазмерСписка() > 1 Тогда ИмяСтраницы = ""; Если СпсМеню.ВыбратьЗначение(ИмяСтраницы,"Выбрать загружаемый лист...",,60,0) <> 1 Тогда db.Close(); Возврат; КонецЕсли; ИначеЕсли СпсМеню.РазмерСписка() = 1 Тогда ИмяСтраницы = СпсМеню.ПолучитьЗначение(1); Иначе db.Close(); Возврат; КонецЕсли; //Начнем поэтапно считывать данне из таблиц!!! //rs=0; //rs=CreateObject("ADODB.Recordset"); rs.ActiveConnection = db; rs.CursorType = 3; rs.LockType = 2; rs.Source = "Select * from ["+ИмяСтраницы+"]"; rs.Open(); Для Ном = 1 По 10 Цикл // Добавление новой записи rs.AddNew(); rs.Fields(0).Value = Ном; rs.Fields(1).Value = "=10*20"; rs.Fields(2).Value = "=20*50"; // Обновление изменений в книге Excel rs.UpDate(); КонецЦикла; // Закрываем соединение rs.Close(); db.Close(); rs = 0; db = 0; //rs.Fields.Count = количество колонок :) -1, т.к. начинется все с 0-ля //Еще один тест... СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+ПутьИмяФайлаЕксель+"; Extended Properties=""Excel 8.0;HDR=YES"";"; Connection = СоздатьОбъект("ADODB.Connection"); Connection.ConnectionString = СтрокаПодключения; Connection.Open(); Command = СоздатьОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandText = "CREATE TABLE [МояТаблица] |(Символьный char(255), Дата date, Целый int, Дробный float)"; Command.Execute(); Command.CommandText = "INSERT INTO [МояТаблица] |(Символьный, Дата, Целый, Дробный) |values ('АБВГДЕЁ', '12/4/1955', '1234567', '12345,6789')"; Command.Execute(); Command = 0; Connection.Close(); Connection = 0; //Исключение // Сообщить("Ошибка при загрузки данных из екселя!!! // |Описание: "+ОписаниеОшибки(),"!"); // Возврат; //КонецПопытки; КонецПроцедуры // ЗаписатьДанныеЕксельЧерезADO(ТЗ_ДляЗаписи, ПутьИмяФайлаЕксель) |
|||
40
ЧеловекДуши
19.11.12
✎
08:11
|
(38)Не отвлекайся, тролька
|
|||
41
ЧеловекДуши
19.11.12
✎
08:14
|
+ Процедура "ЗаписатьДанныеЕксельЧерезADO" не дописана.
Но если ты Прораммист 1С, то почерпнешь для себя нужную информацию. Хотя, я сомневаюсь. |
|||
42
Maximysis
19.11.12
✎
08:18
|
что за бред! (39)
как всегда нержи бесполезно длинный код типа я самый умный, попробуй разберись)))))) |
|||
43
ЧеловекДуши
19.11.12
✎
08:20
|
(42)Там комментарии.
И там запись Excel через ADO, без самого Excel-ля. :) А по сути там есть все, вплоть для получения списка страниц в екселе. |
|||
44
Maximysis
19.11.12
✎
08:20
|
Кто с бейсиком работал люди отзовитесь
|
|||
45
ЧеловекДуши
19.11.12
✎
08:21
|
+(42)Я на другое и не расчитывал :)
|
|||
46
ЧеловекДуши
19.11.12
✎
08:21
|
||||
47
Maximysis
19.11.12
✎
08:23
|
(43)короче не знаешь Excel.Application нечего тролить!
|
|||
48
КонецЦикла
19.11.12
✎
08:23
|
Еще есть вариант: выполнить макрос екселя из 1с по замене то что не нужно на то что нужно
ЗЫ. так и не понял что нужно автору |
|||
49
Maximysis
19.11.12
✎
08:24
|
вопрос был не поро адо
|
|||
50
Maximysis
19.11.12
✎
08:24
|
(48) не выход доки будут разные, вписывать макрос в док при открытии геморойней((
|
|||
51
ЧеловекДуши
19.11.12
✎
08:25
|
(49)А вы неадекват. ;)
Вас даже (48) Многоуважаемый КонецЦикла не понимает :) |
|||
52
ЧеловекДуши
19.11.12
✎
08:26
|
(50)Отдышись, и напиши нормально, что тебе надо. А то ЯнечегоНеПонимаю :)
|
|||
53
КонецЦикла
19.11.12
✎
08:28
|
(50) Можно запускать макрос из одного и того же шаблона
Он будет творить чудеса с файлом ЗЫ. Ваш кеп |
|||
56
Maximysis
19.11.12
✎
08:33
|
(53) да попробую если с бейсиком не разберусь(
|
|||
57
КонецЦикла
19.11.12
✎
08:34
|
Товарищи, будьте вежливы
|
|||
59
ЧеловекДуши
19.11.12
✎
08:35
|
(53)Ему не по может. У него же много екселей и разного формата :)
|
|||
60
КонецЦикла
19.11.12
✎
08:36
|
(56) Выведи Сообщить(Значение)
Увидишь что там такое получается Далее орудуй по ситуации Никто не понял нужен ноль или нет и что вообще нужно |
|||
61
Maximysis
19.11.12
✎
08:50
|
(60)Нужен и ноль и пустое значение. Сейчас если пустое значение я заменяю на необходимые числа. Мне нужно отлавливать где в ексле пустое значение а где 0.
чтобы нуль не трогать. |
|||
62
Мимохожий Однако
19.11.12
✎
08:52
|
(61)Зачем это семерке? Она всё равно не различает пустое значение и нуль, если считывает число.
|
|||
63
КонецЦикла
19.11.12
✎
08:53
|
Тогда ПустаяСтрока(), возможно, далее проверка на 0
|
|||
64
Maximysis
19.11.12
✎
09:02
|
(62) вот по этому я и хочу определять это не в семерке....
(63) Нет смотри. я загружаю ексел с ячейками а1=0 а2=null ПустоеЗначение = Лист.Cells(а, 1).Value = Лист.Cells(а, 2).Value; поэтом нужно чтото типа Если Value.IsEmpty()=1 Тогда текущаяСтрока="СтрокаИндификаторПустойСтроки"; Конецесли; а потом при обработке сравнивать Если текущееЗначение="СтрокаИндификаторПустойСтроки" Тогда текущееЗначение= ВычислитьЧтоТо(); КонецЕсли; |
|||
65
Мимохожий Однако
19.11.12
✎
09:05
|
(64) к какой ошибке в семерке приводит то, что не можешь отличить Пустое значение от нуля?
|
|||
66
vde69
19.11.12
✎
09:06
|
Попытка
ТекущееЗначениеФормулы = ExcelЛист.Cells(НомерСтроки, НомерКолонки).Formula; Если ТекущееЗначениеФормулы <> "" Тогда Если Лев(ТекущееЗначениеФормулы, 1) <> "=" Тогда Результат.Вставить("ЭтоФормула", Ложь); Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value); Иначе Результат.Вставить("ЭтоФормула", Истина); Если Лев(СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).text),1) = "#" Тогда Результат.Вставить("ЗначениеЯчейки", Неопределено); Иначе Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value); КонецЕсли; Если ПолучатьТекстФормулы Тогда Результат.Вставить("ТекстФормулы", СокрЛП(ТекущееЗначениеФормулы)); КонецЕсли; КонецЕсли; Иначе Результат.Вставить("ЭтоФормула", Ложь); Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value); КонецЕсли; Если ПолучатьОформление Тогда Результат.Вставить("ЦветЯчейки", СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).Interior.ColorIndex)); // здесь можно добавить и другие.... КонецЕсли; Исключение Результат = Неопределено; КонецПопытки; |
|||
67
Maximysis
19.11.12
✎
09:08
|
(65) в 1С7 ПустаяСтрока и 0 равны.
|
|||
68
Мимохожий Однако
19.11.12
✎
09:10
|
(67)То что они это давно ясно )))
Повторюсь: зачем нужно различать? Должно быть, разное поведение в семерке? В таком случае проще сначала запустить макрос и для пустого значения явно прописать нужное значение перед обработкой из 77 |
|||
69
ЧеловекДуши
19.11.12
✎
09:11
|
(66)Спасибо :)
А исключения в какой момент могут иметь место? |
|||
70
Maximysis
19.11.12
✎
09:16
|
(66) нету проверки на пустое значение(
(67)Да нужно различать я писал (64). да есть некрасивый вариант в ексели заменять 0 например на "#*123абв@!^", и потом сравнивать при загрузке. то хотелось бы все проверять при загрузке.... |
|||
71
vde69
19.11.12
✎
09:18
|
(70) пустое значение вернет "неопределено"
а NULL в екселе в ячейке не может лежать... |
|||
72
Maximysis
19.11.12
✎
09:34
|
(71)про Null я образно говорю)
Как я понял если пустая ячейка то ExcelЛист.Cells(НомерСтроки, НомерКолонки).Formula; вызовит ошибку и так поймать NUll?? |
|||
73
vde69
19.11.12
✎
09:39
|
в екселе есть функции ЕПУСТО, ЕНД
но приведеный мною код корректно все отрабатывает... |
|||
74
Popkorm
19.11.12
✎
11:15
|
(61)
Значение = СокрЛП(Лист.Cells(х, у).Value); Если Значение = "" Тогда ИначеЕсли Значение = 0 Тогда ИначеЕсли Значение = "0" Тогда ИначеЕсли ПустоеЗначеине(Значение) = 1 Тогда |
|||
75
Maximysis
20.11.12
✎
08:20
|
(74) Спасибо решил похожим способом
Если (ПустоеЗначеине(ЗначениеИзЕкселя)=0) и (ТипЗначенияСтр(ЗначениеИзЕкселя)="Число") Тогда значение=ЗначениеИзЕкселя; КонецЕсли; Заметил что если в екселе был нуль то тип значения числовое, а если ячейка пустая то тип не определенный. Тема закрыта. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |