Ошибка при вызове метода контекста specialcells

Загрузка из Эксель: Ошибка при вызове метода контекста (ПолучитьОбъект)

Я

  

Старуха Шапокляк

26.02.10 — 14:53

Загружаю из Эксель в спр.Номенклатура файл, содержащий два столбца:

«КодТовара» и «НовыйРеквизит» (этот реквизит мы завели в спр.Номенклатура и теперь его надо заполнить данными из файла). Все загружает нормально, только когда доходит до последнего элемента, выдает ошибку:

{Форма.Форма(114)}: Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!

       Товар = Товар.ПолучитьОбъект();

по причине:

Элемент не выбран!

И Эксель зависает, хотя все подгрузил без ошибок…

Вот мой код:

НомерЛиста  = 1;

   Попытка

       Excel = новый COMОбъект(«Excel.Application»);

   Исключение

       Сообщить(«Excel на компьютере не установлен.»);

       Возврат;

   КонецПопытки;    

   

   Excel.Workbooks.Open(ИмяФайла);

   Excel.Sheets(НомерЛиста).select();  

   Версия = Лев(Excel.Version,Найти(Excel.Version,».»)-1);

   Если Версия = «8» тогда

       ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;

       ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);

   Иначе

       ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;

       ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  

   Конецесли;

   

   НомерКолонкиКодаТовара = 1;

   НомерКолонкиНовогоРеквизита = 2;

   

   Для а = 2 По 469 Цикл

       КодТовара             = СокрЛП(Excel.Cells(а,НомерКолонкиКодаТовара).Value);

       НовыйРеквизит = СокрЛП(Excel.Cells(а,НомерКолонкиНовогоРеквизита).Value);

       Товар = Справочники.Номенклатура.НайтиПоКоду(КодТовара);

       Сообщить(«Нашел Код номенклатуры» + КодТовара);

       Товар = Товар.ПолучитьОбъект();

       Товар.НовыйРеквизит = НовыйРеквизит;

       Товар.Записать();

   Конеццикла;

   
   Excel.ActiveWorkbook.Close();

  

73

1 — 26.02.10 — 14:55

С чего это такая уверенность, что «Нашел Код номенклатуры»?

  

dk

2 — 26.02.10 — 14:56

А кто будет проверять нашелся товар по коду или нет?

  

Старуха Шапокляк

3 — 26.02.10 — 15:07

(2) а как?

  

skunk

4 — 26.02.10 — 15:09

Товар.ПустаяССылка()

  

73

5 — 26.02.10 — 15:09

СП:

Пример:

СтрокаКода = «840»;

Валюты = Справочники.Валюты;

НайденнаяСсылка = Валюты.НайтиПоКоду(СтрокаКода);

Если НайденнаяСсылка = Валюты.ПустаяСсылка() Тогда

   Сообщить(«Валюты «»» + СтрокаКода + «»» еще нет»);

КонецЕсли;

  

skunk

6 — 26.02.10 — 15:10

(5)полный пипец

  

73

7 — 26.02.10 — 15:11

(6) Это пример из СП.

Полный пипец — это (4).

Если уж так, как ты предлагаешь проверять, то: Товар.Пустая()

  

Старуха Шапокляк

8 — 26.02.10 — 15:11

(4), (6) а как надо правильно, применительно к моему коду в (0)???

  

73

9 — 26.02.10 — 15:12

(8) Ну-ну…

  

skunk

10 — 26.02.10 — 15:14

(7)ну да согласен … затупил с сылкой

  

Старуха Шапокляк

11 — 26.02.10 — 15:16

Так будет правильно?

……
Товар = Справочники.Номенклатура.НайтиПоКоду(КодТовара);
Если Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
Сообщить(«Строка НЕ ЗАГРУЖЕНА. Код Номенклатуры «+КодТовара+» не  найден в справочнике.»);
Продолжить;
КонецЕсли;
Сообщить(«Нашел Код номенклатуры» + КодТовара);
Товар = Товар.ПолучитьОбъект();
Товар.НовыйРеквизит = НовыйРеквизит;
Товар.Записать();
Конеццикла;

  

dk

12 — 26.02.10 — 15:22

сойдет

  

Старуха Шапокляк

13 — 26.02.10 — 15:36

Еще подскажите пож-та, т.к. даже если в файле меньше 469 строк, он все равно обрабатывал все 469 строчки, то я исправила строчки:
Было:

Для а = 2 По 469 Цикл

КонецЦикла;

Стало:

Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

КонецЦикла;

Стал выдавать ошибку:

{Форма.Форма(114)}: Ошибка при вызове метода контекста (SpecialCells): Произошла исключительная ситуация (Microsoft Office Excel): Unable to get the SpecialCells property of the Range class
   Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл
по причине:
Произошла исключительная ситуация (Microsoft Office Excel): Unable to get the SpecialCells property of the Range class

  

Старуха Шапокляк

14 — 26.02.10 — 15:41

Вот мой текст итоговый:

НомерЛиста  = 1;
   Попытка
       Excel = новый COMОбъект(«Excel.Application»);
   Исключение
       Сообщить(«Excel на компьютере не установлен.»);
       Возврат;
   КонецПопытки;    

       Excel.Workbooks.Open(ИмяФайла);
   Excel.Sheets(НомерЛиста).select();  

       Версия = Лев(Excel.Version,Найти(Excel.Version,».»)-1);
   Если Версия = «8» тогда
       ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
       ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
   Иначе
       ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
       ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  
   Конецесли;

       НомерКолонкиКодаТовара = 1;
   НомерКолонкиНовогоРеквизита = 2;

           //Для а = 2 По 469 Цикл
   Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

               КодТовара             = СокрЛП(Excel.Cells(а,НомерКолонкиКодаТовара).Value);
       НовыйРеквизит = СокрЛП(Excel.Cells(а,НомерКолонкиНовогоРеквизита).Value);
       Товар = Справочники.Номенклатура.НайтиПоКоду(КодТовара);
       Если Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
           Сообщить(«Строка НЕ ЗАГРУЖЕНА. Код Номенклатуры «+КодТовара+» не  найден в справочнике.»);
           Продолжить;
       КонецЕсли;

               Сообщить(«Нашел Код номенклатуры» + КодТовара);
       Товар = Товар.ПолучитьОбъект();
       Товар.НовыйРеквизит = НовыйРеквизит;
       Товар.Записать();
   Конеццикла;

  

Старуха Шапокляк

15 — 26.02.10 — 15:57

up!

  

dk

16 — 26.02.10 — 16:00

SpecialCells(11)

  

SlavCO

17 — 26.02.10 — 16:01

Для а = 2 по ФайлСтрок Цикл

Попробуй так

  

dk

18 — 26.02.10 — 16:01

хотя …

нафига Excel.Cells(2,1).SpecialCells(21).Row

просто 1

  

Дикообразко

19 — 26.02.10 — 16:05

ИМХО
предположу что нет 21 колонки

КМК должно быть так:

  Для а = 2 По ФайлСтрок Цикл

  

dk

20 — 26.02.10 — 16:08

(19) это не колонка

  

Дикообразко

21 — 26.02.10 — 16:08

(20) а что?

  

dk

22 — 26.02.10 — 16:09

открой для себя справку по VBA )

  

Дикообразко

23 — 26.02.10 — 16:11

(22) XlCellType constants    Value
xlCellTypeAllFormatConditions. Cells of any format    -4172
xlCellTypeAllValidation. Cells having validation criteria    -4174
xlCellTypeBlanks. Empty cells    4
xlCellTypeComments. Cells containing notes    -4144
xlCellTypeConstants. Cells containing constants    2
xlCellTypeFormulas. Cells containing formulas    -4123
xlCellTypeLastCell. The last cell in the used range    11
xlCellTypeSameFormatConditions. Cells having the same format    -4173
xlCellTypeSameValidation. Cells having the same validation criteria    -4175
xlCellTypeVisible. All visible cells    12

ну и где там 21 ?

  

Дикообразко

24 — 26.02.10 — 16:11

может надо было указать 12 ?
xlCellTypeVisible. All visible cells    12

  

Дикообразко

25 — 26.02.10 — 16:11

или 4 ?

  

dk

26 — 26.02.10 — 16:12

а вообще (14) сильно корявый код хоть и рабочий частично

Книга = Excel.Workbooks.Open(ИмяФайла);

Лист = Книга.Sheets(НомерЛиста);

НовыйРеквизит = СокрЛП(Лист.Cells(а,НомерКолонкиНовогоРеквизита).Value);

ФайлКолонок = Лист.SpecialCells(11).Column;

и т.д. и т.п.

  

Дикообразко

27 — 26.02.10 — 16:12

(22) я смотрю ты открывать то умеешь, вот только пользоваться не очень

  

dk

28 — 26.02.10 — 16:13

(23) XlCellType <> номер колонки? ))

  

dk

29 — 26.02.10 — 16:15

))

  

Дикообразко

30 — 26.02.10 — 16:18

(28) да я вообще VBA в глаза не видел ….
раза 2 за 10 лет открывал, откуда мне знать? я просто предположил..

  

Дикообразко

31 — 26.02.10 — 16:18

и кстати угадал

тебе виднее )

Здравствуйте! Подскажите, пожалуйста! Загружаю из Excel данные, хочу обратиться к именованной области, выдает следующую ошибку: «Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
по причине:
Произошла исключительная ситуация (0x800a03ec)»

Процедура ОсновныеДействияФормыЗагрузить(Кнопка)

НомерКолонкиАртикул = ЭлементыФормы.ТабличныйДокумент.Область(«R2C1»;
НомерКолонкиНаименованияТовара = ЭлементыФормы.ТабличныйДокумент.Область(«R2C2»;
НомерКолонкиЕдиницаИзмерения = ЭлементыФормы.ТабличныйДокумент.Область(«R2C3»;
НомерКолонкиСтрана = ЭлементыФормы.ТабличныйДокумент.Область(«R2C4»;

//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Excel = новый COMОбъект(«Excel.Application»;

Версия = Лев(Excel.Version,Найти(Excel.Version,».»-1);
Если Версия = «8» тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
ФайлКолонок = Excel.Cells(2,1).SpecialCells(21).Column;
Конецесли;

// Выбираем данные из файла
Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

//Полуим данные из соответсвующих ячеек
Артикул = СокрЛП(Excel.Cells(а,Артикул).Value);
НаименованиеТовара = СокрЛП(Excel.Cells(а,НомерКолонкиНаименованияТовара).Value);
ЕдиницаИзмерения = СокрЛП(Excel.Cells(а,НомерКолонкиЕдиницаИзмерения).Value);

Товар = Справочники.Номенклатура.ПустаяСсылка();

// Ищем товар в справочнике по коду
Товар = Справочники.Номенклатура.НайтиПоКоду.Артикул;

// Если не нашли по коду, то ищем по наименованию
Если Товар.Пустая() Тогда
Товар = Справочники.Номенклатура.НайтиПоНаименованию.Наименование;
Конецесли;

//Если не нашли создаем новый
Если Товар.Пустая() Тогда
Товар = Справочники.Номенклатура.СоздатьЭлемент();
Товар.Наименование = НаименованиеТовара;
Товар.Артикул = Артикул;
Товар.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;
Товар.СтранаПроисхождения = НомерКолонкиСтрана;
Товар.Записать();
Конецесли;
КонецЦикла;

КонецПроцедуры

 

Добрый день.

Столкнулся с такой проблемой: не могу найти пустые ячейки с помощью метода .SpecialCells(xlCellTypeBlanks)
Диапазон точно пустой, так как он выбирается на только что созданном чистом листе. Он выбирается и… выдает ошибку при поиске пустых ячеек.
При этом .SpecialCells(xlCellTypeConstants) тоже ничего не находит… Впрочем, как и поиск по формулам или еще по чему.

Но стоит сделать .Clear, как пустые ячейки начинают определяться, как пустые…. Но что это за бред, какими они были до этого? Как мне найти пустые ячейки?

Изменено: Vhodnoylogin21.04.2017 09:34:43

 

AAF

Пользователь

Сообщений: 1000
Регистрация: 18.12.2016

Вы описываете как работали над чем-то… и это похоже был файлик со своими проблемами… Да?
А где он? Или Вы думаете, что здесь моделируют проблемы по описанию, а потом рассказывают как их решить?  :D

 

Vhodnoylogin

Пользователь

Сообщений: 44
Регистрация: 27.09.2016

#3

21.04.2017 09:36:08

Ничего не понял… Проблема либо есть, либо ее нет. Просто выберете

Если нужен код (зачем?) — вот он:

Код
Public Sub hp_SetCopyFormates( _
                        ByRef acceptor As Range, _
                        ByRef donor_for_filled_cells As Range, _
                        ByRef donor_for_empty_cells As Range _
                    )
    With acceptor
        On Error GoTo errLabel1
        With .SpecialCells(xlCellTypeBlanks)
            donor_for_empty_cells.Copy
            .PasteSpecial xlPasteValidation
            .PasteSpecial xlPasteFormats
            .PasteSpecial xlPasteColumnWidths
            .PasteSpecial xlPasteFormulas
        End With
nextLabel1:
        On Error GoTo errLabel2
        With .SpecialCells(xlCellTypeConstants)
            donor_for_filled_cells.Copy
            .PasteSpecial xlPasteValidation
            .PasteSpecial xlPasteFormats
            .PasteSpecial xlPasteColumnWidths
            .PasteSpecial xlPasteFormulas
        End With
    End With
nextLabel2:
    Exit Sub
    
    '---------------------'
errLabel1:
    Resume nextLabel1
errLabel2:
    Resume nextLabel2
End Sub

Вставляйте любые диапазоны. Если Аксептор будет пустым полностью, то .SpecialCells(xlCellTypeBlanks) не сработает. И я спрашиваю — что делать?

Изменено: Vhodnoylogin21.04.2017 09:53:11

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Я сам — дурнее всякого примера! …

 

Пытливый

Пользователь

Сообщений: 4680
Регистрация: 22.12.2012

Может в шаблоне, на основании которого создается новый лист чего этого… .того… не то? :)

Кому решение нужно — тот пример и рисует.

 

Vhodnoylogin

Пользователь

Сообщений: 44
Регистрация: 27.09.2016

#6

21.04.2017 09:46:28

Да возьмите любой пустой диапазон и

Код
selection.SpecialCells(xlCellTypeBlanks).select
 

AAF

Пользователь

Сообщений: 1000
Регистрация: 18.12.2016

Vhodnoylogin, в пределах .UsedRange
Вернее нет, я не правильно выразился…
Если нет ни одной используемой ячейки, то будет ошибка
Достаточно закрасить даже цветом одну и все путем.

Изменено: AAF21.04.2017 10:10:13

 

V

Пользователь

Сообщений: 5055
Регистрация: 22.12.2012

зачем искать пустые ячейки на пустом листе?

 

Vhodnoylogin

Пользователь

Сообщений: 44
Регистрация: 27.09.2016

#9

21.04.2017 10:14:20

Цитата
AAF написал:
Достаточно закрасить даже цветом одну и все путем.

Недостаточно… Ведь смысл кода в том, чтобы запилить форматы для выбранного рейнджа…

Чтобы работало, нужно дополнить код этим:

Код
If WorksheetFunction.CountA(acceptor) = 0 Then
            donor_for_filled_cells.Copy
            .PasteSpecial xlPasteValidation
            .PasteSpecial xlPasteFormats
            .PasteSpecial xlPasteColumnWidths
            .PasteSpecial xlPasteFormulas
        End If
 

AAF

Пользователь

Сообщений: 1000
Регистрация: 18.12.2016

Вот если б Вы выложили файл…
А то мне самому рисовать доноров и акцепторов?
Вы четко представляете Вашу задачу и для Вас не сложно сделать это.
Я сейчас не вижу проблем… В чем они?

 

The_Prist

Пользователь

Сообщений: 14272
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#11

21.04.2017 14:39:47

Цитата
Vhodnoylogin написал:
Но стоит сделать .Clear, как пустые ячейки начинают определяться, как пустые

возможно, повреждение книги. Такое поведение может быть в одном случае: в ячейках не пустые значения, а строки нулевой длины. Такое может наблюдаться при создании файлов путем выгрузки из 1С.
Попробуйте сделать все в новом файле.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Юрий М

Модератор

Сообщений: 60810
Регистрация: 14.09.2012

Контакты см. в профиле

#12

21.04.2017 15:07:09

Цитата
The_Prist написал:
возможно, повреждение книги

Дим, я в новой книге в А1 записал единичку, выделяю А1:А5, выполняю макрос

Код
Sub qqq()
    Selection.SpecialCells(xlCellTypeBlanks).Select
End Sub

и получаю ошибку с сообщением, что не найдено ни одной ячейки, удовлетворяющей указанным условиям.
Мало того: F5 — выделить — Пустые ячейки, получаю аналогичное сообщение.
Получается, что и у меня повреждена новая книга?

 

The_Prist

Пользователь

Сообщений: 14272
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

А, если вообще нет значений — это логично, т.к. диапазон рабочий пока еще только из одной ячейки(точнее — из ни одной :)) и любая конструкция SpecialCells будет ломаться, т.к. не работает для ни одной ячейки.
Я обычно перед использованием SpecialCells проверяю сколько будет ячеек в необходимом диапазоне. И если только одна ячейка в рабочем диапазоне — то проверяю через свойства самой ячейки.

Изменено: The_Prist21.04.2017 15:17:15

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Юрий М

Модератор

Сообщений: 60810
Регистрация: 14.09.2012

Контакты см. в профиле

#14

21.04.2017 15:21:42

Цитата
The_Prist написал:
А, если вообще нет значений — это логично

Но у меня ведь одна заполнена )

 

Юрий М

Модератор

Сообщений: 60810
Регистрация: 14.09.2012

Контакты см. в профиле

Заполнил А1 и А5, выделил А1:А5, выполнил макрос — выделено три ячейки А2:А4. Вывод: работает в пределах UsedRange. Так? )

 

The_Prist

Пользователь

Сообщений: 14272
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#16

21.04.2017 15:52:11

Цитата
Юрий М написал:
работает в пределах UsedRange

Да

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

AAF

Пользователь

Сообщений: 1000
Регистрация: 18.12.2016

#17

21.04.2017 17:43:49

Цитата
Юрий М написал:
работает в пределах UsedRange

Нет….  :)

Код
Sub test1()
'вот здесь будет ошибка
Sheets.Add
Range("A1") = 1
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks)
Rng.Select
End Sub
Sub test2()
'вот здесь иллюстрация работы .SpecialCells(xlCellTypeBlanks)
Sheets.Add: Range("B2") = 1
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
For i = 1 To Rng.Areas.Count
  s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
Next
MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s: s = ""
Sheets.Add: Range("C3:G7") = 1
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
For i = 1 To Rng.Areas.Count
  s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
Next
MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s: s = ""
Sheets.Add: Range("C3:G7") = 1
Range("F6:H8").EntireRow.Rows.Hidden = True
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
For i = 1 To Rng.Areas.Count
  s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
Next
MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s
'стоит обратить внимание и на это поведение SpecialCells
s = "xlCellTypeLastCell    " & Cells(1).SpecialCells(xlCellTypeLastCell).Address
Set usRng = ActiveSheet.UsedRange
Set curReg = Range("C3:G7")
MsgBox s & vbCrLf & "последняя UsedRange    " & usRng.Cells(usRng.Rows.Count, usRng.Columns.Count).Address _
  & vbCrLf & "последняя CurRegion    " & curReg.Cells(curReg.Rows.Count, curReg.Columns.Count).Address
End Sub

Изменено: AAF21.04.2017 18:02:08

Ошибка при выборе листа эксель

Я

falselight

21.03.19 — 10:34

Использую обработку для загрузки данных с эксель листов.

На форме появилось дерево, файла эксель и его листов. Выбираю лист.

Жму прочитать, в тз появляются данные.

Но если выбрать другой лист и нажать прочитать, то, выходит ошибка

{ВнешняяОбработка.ЗагрузкаИзExcel_1_2.Форма.Форма.Форма(319)}: Ошибка при вызове метода контекста (Sheets)

    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();  

по причине:

Произошла исключительная ситуация (0x800a03ec)

То есть как её исключить? Что бы перечитывался другой выбранный лист?

falselight

1 — 21.03.19 — 10:39

Вижу ошибку, Excel — не определена в этом случае. Наверное в этом дело.

falselight

2 — 21.03.19 — 10:44

Все же ошибка идет, не подскажете почему?

{ВнешняяОбработка.ЗагрузкаИзExcel_1_2.Форма.Форма.Форма(329)}: Ошибка при вызове метода контекста (Sheets)

    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();  

по причине:

Произошла исключительная ситуация (0x800a03ec)

Дмитрий

3 — 21.03.19 — 10:44

ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы чему равно?

falselight

4 — 21.03.19 — 10:51

Почему вот это бывает пустое?????

При первой загрузке там COMОбъект

(3) Названию выбранного листа.

falselight

5 — 21.03.19 — 10:51

(4+) Excel.Sheets

falselight

6 — 21.03.19 — 10:57

Точку останова ставлю, вроде как обновляются данные

без точки останова ошибка, как будто COMОбъект не успевает считаться, как тут быть?

falselight

7 — 21.03.19 — 10:58

как с этим быть? Что то не понятно!!!!

falselight

8 — 21.03.19 — 11:06

Почему не видна функция в 1с ТекущееВремя() ?

falselight

9 — 21.03.19 — 11:08

Хотел вот такую функцию использовать, паузу. но она не работает.

Процедура Пауза(Время)

чЧас=0; чМин=0; чСек=0;

ТекущееВремя(чЧас,чМин,чСек);

чТекВремя = чЧас*3600+чМин*60+чСек;

чВремяЗавершения = чТекВремя+Время;

Пока чТекВремя<чВремяЗавершения Цикл

ТекущееВремя(чЧас,чМин,чСек);

чТекВремя = чЧас*3600+чМин*60+чСек;

КонецЦикла;

КонецПроцедуры;

falselight

10 — 21.03.19 — 12:17

Ставлю точку останова на этой строке.

// ЧТЕНИЕ ЛИСТА

Процедура КоманднаяПанель1ПрочитатьДанныеСЛиста(Кнопка)

    Если ОбрЗавершена = 1 Тогда

        Сообщить(«Данный файл уже был обработан. Перезапустите обработку и выберите новый файл для загрузки!»);

        Возврат;

    КонецЕсли;

    //

    // Необходимый лист

    Если Найти(СокрЛП(Строка(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы)), «xls») > 0 Тогда

        Предупреждение(«Выберите конкретный лист для загрузки, а не сам файл!»);

        Возврат;

    КонецЕсли;

    //

    Если Excel = неопределено Тогда

        Попытка

            Excel = новый COMОбъект(«Excel.Application»);

        Исключение

            Сообщить(«Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.»);

            Возврат;

        КонецПопытки;    

        //НашФайл = Excel.Workbooks.Open(ИмяФайла);

        Excel.Workbooks.Open(ИмяФайла);

    КонецЕсли;

    //

    //ПаузаПустымЦиклом(5);

    //

    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();  

Читаю листы, у загруженного файла в дерево. Читается как и один так и другой.

Останавливаясь на точке останова. Как только я убираю точку останова, при этих же действиях вываливается ошибка.

{ВнешняяОбработка.ЗагрузкаИзExcel_1_2.Форма.Форма.Форма(333)}: Ошибка при вызове метода контекста (Sheets)

    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();  

по причине:

Произошла исключительная ситуация (0x800a03ec)

Что нужно поправить? Подскажите пожалуйста!

  

falselight

11 — 21.03.19 — 12:21

Решил вопрос.

Нужно было сделать так, —

    Excel = Неопределено;

    //

КонецПроцедуры

Ошибка при выборе листа эксель

Я

falselight

21.03.19 — 10:34

Использую обработку для загрузки данных с эксель листов.

На форме появилось дерево, файла эксель и его листов. Выбираю лист.

Жму прочитать, в тз появляются данные.

Но если выбрать другой лист и нажать прочитать, то, выходит ошибка

{ВнешняяОбработка.ЗагрузкаИзExcel_1_2.Форма.Форма.Форма(319)}: Ошибка при вызове метода контекста (Sheets)

    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();  

по причине:

Произошла исключительная ситуация (0x800a03ec)

То есть как её исключить? Что бы перечитывался другой выбранный лист?

falselight

1 — 21.03.19 — 10:39

Вижу ошибку, Excel — не определена в этом случае. Наверное в этом дело.

falselight

2 — 21.03.19 — 10:44

Все же ошибка идет, не подскажете почему?

{ВнешняяОбработка.ЗагрузкаИзExcel_1_2.Форма.Форма.Форма(329)}: Ошибка при вызове метода контекста (Sheets)
    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();   

по причине:

Произошла исключительная ситуация (0x800a03ec)

Дмитрий

3 — 21.03.19 — 10:44

ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы чему равно?

falselight

4 — 21.03.19 — 10:51

Почему вот это бывает пустое?????

При первой загрузке там COMОбъект

(3) Названию выбранного листа.

falselight

5 — 21.03.19 — 10:51

(4+) Excel.Sheets

falselight

6 — 21.03.19 — 10:57

Точку останова ставлю, вроде как обновляются данные

без точки останова ошибка, как будто COMОбъект не успевает считаться, как тут быть?

falselight

7 — 21.03.19 — 10:58

как с этим быть? Что то не понятно!!!!

falselight

8 — 21.03.19 — 11:06

Почему не видна функция в 1с ТекущееВремя() ?

falselight

9 — 21.03.19 — 11:08

Хотел вот такую функцию использовать, паузу. но она не работает.

Процедура Пауза(Время) 
чЧас=0; чМин=0; чСек=0; 
ТекущееВремя(чЧас,чМин,чСек); 
чТекВремя = чЧас*3600+чМин*60+чСек; 
чВремяЗавершения = чТекВремя+Время; 
Пока чТекВремя<чВремяЗавершения Цикл 
ТекущееВремя(чЧас,чМин,чСек); 
чТекВремя = чЧас*3600+чМин*60+чСек; 
КонецЦикла; 
КонецПроцедуры;

falselight

10 — 21.03.19 — 12:17

Ставлю точку останова на этой строке.

// ЧТЕНИЕ ЛИСТА

Процедура КоманднаяПанель1ПрочитатьДанныеСЛиста(Кнопка)
    Если ОбрЗавершена = 1 Тогда 
        Сообщить("Данный файл уже был обработан. Перезапустите обработку и выберите новый файл для загрузки!");
        Возврат;
    КонецЕсли;
    //

    // Необходимый лист

    Если Найти(СокрЛП(Строка(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы)), "xls") > 0 Тогда
        Предупреждение("Выберите конкретный лист для загрузки, а не сам файл!");
        Возврат;
    КонецЕсли;
    //

    Если Excel = неопределено Тогда 
        Попытка
            Excel = новый COMОбъект("Excel.Application");
        Исключение
            Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
            Возврат;
        КонецПопытки;     
        //НашФайл = Excel.Workbooks.Open(ИмяФайла);

        Excel.Workbooks.Open(ИмяФайла);
    КонецЕсли;
    //

    //ПаузаПустымЦиклом(5);

    //

    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();   


Читаю листы, у загруженного файла в дерево. Читается как и один так и другой.

Останавливаясь на точке останова. Как только я убираю точку останова, при этих же действиях вываливается ошибка.

{ВнешняяОбработка.ЗагрузкаИзExcel_1_2.Форма.Форма.Форма(333)}: Ошибка при вызове метода контекста (Sheets)
    Excel.Sheets(ЭлементыФормы.ДеревоЛистов.ТекущаяСтрока.Листы).select();   
по причине:
Произошла исключительная ситуация (0x800a03ec)


Что нужно поправить? Подскажите пожалуйста!

  

falselight

11 — 21.03.19 — 12:21

Решил вопрос.

Нужно было сделать так, -

    Excel = Неопределено;
    //

КонецПроцедуры

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.

  • shtucer-igor 04.03.2009 at 12:54

    однозначно плюс !

    а можно тоже самое но чтобы грузило в установку цен номенклатуры контрагента ?

    Reply

  • softbear 11.03.2009 at 00:25

    однозначно плюс !

    Reply

  • COMPER 19.03.2009 at 11:51

    не работает. Но красиво

    Reply

  • COMPER 19.03.2009 at 11:53

  • Pim 19.03.2009 at 19:10

    не работает :-(. Самый главный минус всех подобных обработок в том, что они грузят только одну цену в УТ. По крайней мере, я других не видел. Эта обработка похоже тоже грузит только одну цену, да ещё и запоролена…

    А что делать, если мне надо загружать сразу четыре разных типов цен в один документ. (Не надо предлагать загружать по-одному — заказчик не хочет).

    Reply

  • egorover 20.03.2009 at 16:26

    внимательней, там загрузка идёт по всем типам цен в строку

    Reply

  • olee 23.03.2009 at 00:40

    У меня пишет:

    {ВнешняяОбработка.ЗагрузкаЦен(7)}: Ошибка при вызове метода контекста (Sheets): Произошла исключительная ситуация (0x8002000b)

    по причине:

    Произошла исключительная ситуация (0x8002000b)

    Reply

  • egorover 23.03.2009 at 08:03

    всё времени нет, укажите имя листа excel Лист1

    Reply

  • olee 23.03.2009 at 10:39

    Создался пустой документ с комментарием из какого файла загружен.

    Пытаюсь снова загрузить цены — пишет в регистре есть такая строка.

    Захожу в регистр сведений — нет такой записи:(

    Reply

  • olee 25.03.2009 at 00:44

    Разобрался, все работает!

    Очень нужная обработка.

    Плюс.

    Reply

  • dev_gen 31.03.2009 at 13:35

    Ищу по всему инету такую разработку уже неделю.

    Огромное спасибище

    Reply

  • kozakm 11.04.2009 at 08:26

  • VikFx 28.04.2009 at 11:00

    то, что нужно, спасибо

    Reply

  • 4emodan 06.05.2009 at 01:22

    Большое спасибо! Давно искал.

    Reply

  • 4emodan 06.05.2009 at 01:39

    А можно сделать, чтоб находило товары не по артикулу, а по коду?

    Reply

  • petrash 06.06.2009 at 11:50

    Выручил! Спасибо большое!

    Reply

  • qwertylion@rambler.ru 07.06.2009 at 19:01

    Обработка хорошее но вот только документ пустой создается, не подскажите как быть?

    Reply

  • steelrat1976 20.06.2009 at 15:19

    нужно обязательно вводить коэффициент, если цена равна базовой, то коэффициент = 1 и тогда поля не пустые. Хотя можно было бы сказать сразу, а то сам часа два мучался пока не понял

    Reply

  • qwertylion@rambler.ru 26.06.2009 at 22:20

    при записи в ценообразование пустой лист

    Reply

  • qwertylion@rambler.ru 26.06.2009 at 22:22

    все нормально разобрался нужно обязательно вводить коэффициент, если цена равна базовой, то коэффициент = 1 и тогда поля не пустые. Хотя можно было бы сказать сразу, а то сам часа два мучался пока не понял СПАСИБО steelrat1976

    Reply

  • Dimka74 21.07.2009 at 04:29

    Пожалуй повторюсь: «А можно сделать, чтоб находило товары не по артикулу, а по коду?»

    Reply

  • sly99 07.10.2009 at 21:25

    можно поподробнее, что где писать?

    выдает ошибку

    {ВнешняяОбработка.ЗагрузкаЦен(7)}: Ошибка при вызове метода контекста (Sheets): Произошла исключительная ситуация (0x8002000b)

    по причине:

    Произошла исключительная ситуация (0x8002000b)

    Reply

  • cooldanie 06.11.2009 at 15:51

    Автор зачет! а можно по наименованию товара а не по артикулу? или сделайте универсально — по коду, по наименованию, по артикулу — и цены не будет вашей обработке. А если 2 колонки цены? опт и розница — 2я и 3я?

    Reply

  • helloworld 09.11.2009 at 14:31

    {ВнешняяОбработка.ЗагрузкаЦен(7)}: Ошибка при вызове метода контекста (Sheets): Произошла исключительная ситуация (0x8002000b)

    по причине:

    Произошла исключительная ситуация (0x8002000b)

    Это наверное когда страница Екселя названа не Лист1. Автор, выбрал бы просто первую страницу — Excel.Sheets(1).select();

    Reply

  • labuh 26.11.2009 at 03:38

    Автору респект и уважуха.

    А как быть с одинаковыми ценами номенклатуры? Обработка не читает одинаковые цены из экселя, — пишет «не нашли артикул ……..»

    Reply

  • labuh 27.11.2009 at 23:51

    Здесь что, больше никто не живет???

    Reply

  • meser 06.12.2009 at 22:22

    Спасибо, действительно обработка нужная, я бы добавил еще поиск не только по артиклу, но и по коду, наименованию.

    Reply

  • nikser 11.01.2010 at 18:40

    Ничего не понимаю . у кого она работает??? документ изменения цен то создался , но пустой .

    Reply

  • Epishko 14.02.2010 at 22:04

    Потратил массу времени — вбил артикулы, а в результате создает пустой документ. Жаль убитого воскресенья! Все-таки несмотря на обильные ссылки по поиску — эту задачку так пока никто и не решил качественно.

    Reply

  • Родная 14.04.2010 at 10:56

    изначально все получается, но при загрузке, выбранных цен в 1С выдается ошибка

    {ВнешняяОбработка.ЗагрузкаЦен(120)}: Ошибка при вызове метода контекста (Записать): Запись с такими ключевыми полями существует! : Закупочная : ******* (Регистр сведений: Цены номенклатуры; Номер строки: 43)

    по причине:

    Запись с такими ключевыми полями существует! : Закупочная :**********(Регистр сведений: Цены номенклатуры; Номер строки: 43)

    при том что справочник «Установка цен номенклатуры» пуст.

    Что я не так делаю?

    Reply

  • provnick 24.01.2011 at 21:39

    Да уж, было б описание, то немного времени потратить на заполнение формы, оказывается нужно файлик подготовить Excelский, страница Екселя названа должна Лист1 и артикул форматнуть в текстовой, а цены в числовой и заполняется таблица для передачи в документ. Но вопрос вот в чем: как две цены закинуть, поле то одно для выбора цены, у кого получилось? egorover пишет (6) «внимательней, там загрузка идёт по всем типам цен в строку» , но выходит только одна цена, что и как? Да еще пароль, понятно, а то…, что ж мышает второе поле для второй цены сделать, а? хоть бы приходную да расходную. В целом гуд и +, ще б поправить.

    Reply

  • Glenas 28.01.2011 at 14:46

    Здравсвуйте. Помогайте, очень надо. Версия 8,2, УТ 11. При открытии выдавал ошибку, поменял ТипыЦенНоменклатуры на ВидыЦен. Обработка открывается, загружает файл xls, корректно находит цены. При попытке загрузки выдаёт {ВнешняяОбработка.ЗагрузкаЦен.МодульОбъекта(90)}: Поле объекта не обнаружено (НеПроводитьНулевыеЗначения) А код модуля запаролен! Что делать, автор? Спасибо

    Reply

  • egorover 29.07.2011 at 10:03

  • lenka-nes@mail.ru 13.10.2011 at 10:19

    спасибо!пригодилось

    Reply

  • wwizard 01.11.2011 at 17:05

    Пишет Ошибка при вызове метода контекста (Sheets)

    Что делать?

    Reply

  • tgnike 08.11.2011 at 12:30

    Она со всеми екселями работате?

    Reply

  • w22u 21.11.2011 at 14:54

    Спасибо, протестируем Вашу обработку.

    Reply

  • Belka063 30.11.2011 at 09:30

    Работает.Спасибо.Помогло

    Reply

  • AruslanM 07.12.2011 at 10:41

    Спасибо за идею, пригодилось.

    Reply

  • Ibrogim 19.12.2011 at 10:51

    Спасибо за обработку, помогла как пример

    Reply

  • ASoft 18.01.2012 at 22:14

  • maratsat 21.01.2012 at 17:44

    Во-первых, хорошая обработка. Спасибо. Значительно сокращает время ввода документа.

    Во-вторых, предложения по улучшению

    Думаю было бы еще лучше, сделать ввод нескольких типов цен за один раз.

    Или как вариант сделать возможным добавлять разные типы цен к одному документу.

    А иначе получается, что розничные, оптовые и крупнооптовые цены в разных документах, что не удобно.

    Reply

  • wwizard 21.01.2012 at 23:25

    (35) так что делать то

    Reply

  • egorover 23.01.2012 at 21:18

    (42) так для этого и создавалось, колонки в таблице excel и есть различные типы цен

    Reply

  • egorover 23.01.2012 at 21:19

    (43) имя листа в книге excel

    Reply

  • FE_D_OR83 31.01.2012 at 15:11

    Спасибо за обработку,сэкономила время. Радует что каждый может доработать под себя.

    Кстати неплохо бы в неё добавить возможность указывать цены для номенклатуры с характеристиками.

    Reply

  • fonomo0 31.01.2012 at 15:24

    Автор С какими версиями Excel работает ваша отработка?

    Reply

  • AlexxxMksv 29.04.2012 at 12:17

    Скажите ваша обработка может проверять соответствие единицы измерения из файла не с базовой единицей, не с единицей хранения остатков, не с единицей для отчетов, не с единицей мест, а с единицами по классификатору?

    Reply

  • TitanLuchs 17.06.2012 at 13:20

    Замечательная штука, спасибо автору, помог сэкономить время на написание своего подобного «велосипеда»!

    Reply

  • MyPuK_OLD 19.11.2013 at 15:46

    Есть какое-то описание или инструкция по использованию данной обработки? Подойдет ли она для работы с Комплексной автоматизацией редакция 1.1?

    Reply

  • egorover 19.11.2013 at 21:23

    Пробуйте, не пробовал, код открыт

    Reply

  • Здравствуйте! Подскажите, пожалуйста! Загружаю из Excel данные, хочу обратиться к именованной области, выдает следующую ошибку: «Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
    ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
    по причине:
    Произошла исключительная ситуация (0x800a03ec)»

    Процедура ОсновныеДействияФормыЗагрузить(Кнопка)

    НомерКолонкиАртикул = ЭлементыФормы.ТабличныйДокумент.Область(«R2C1»;
    НомерКолонкиНаименованияТовара = ЭлементыФормы.ТабличныйДокумент.Область(«R2C2»;
    НомерКолонкиЕдиницаИзмерения = ЭлементыФормы.ТабличныйДокумент.Область(«R2C3»;
    НомерКолонкиСтрана = ЭлементыФормы.ТабличныйДокумент.Область(«R2C4»;

    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Excel = новый COMОбъект(«Excel.Application»;

    Версия = Лев(Excel.Version,Найти(Excel.Version,».»-1);
    Если Версия = «8» тогда
    ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
    ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
    ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
    ФайлКолонок = Excel.Cells(2,1).SpecialCells(21).Column;
    Конецесли;

    // Выбираем данные из файла
    Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

    //Полуим данные из соответсвующих ячеек
    Артикул = СокрЛП(Excel.Cells(а,Артикул).Value);
    НаименованиеТовара = СокрЛП(Excel.Cells(а,НомерКолонкиНаименованияТовара).Value);
    ЕдиницаИзмерения = СокрЛП(Excel.Cells(а,НомерКолонкиЕдиницаИзмерения).Value);

    Товар = Справочники.Номенклатура.ПустаяСсылка();

    // Ищем товар в справочнике по коду
    Товар = Справочники.Номенклатура.НайтиПоКоду.Артикул;

    // Если не нашли по коду, то ищем по наименованию
    Если Товар.Пустая() Тогда
    Товар = Справочники.Номенклатура.НайтиПоНаименованию.Наименование;
    Конецесли;

    //Если не нашли создаем новый
    Если Товар.Пустая() Тогда
    Товар = Справочники.Номенклатура.СоздатьЭлемент();
    Товар.Наименование = НаименованиеТовара;
    Товар.Артикул = Артикул;
    Товар.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;
    Товар.СтранаПроисхождения = НомерКолонкиСтрана;
    Товар.Записать();
    Конецесли;
    КонецЦикла;

    КонецПроцедуры

    Народ, помогите, не могу понять почему на одном и том компе под разными пользователями работает и не работает, вываливает ошибку «Ошибка при вызове метода контекста (Sheets): Произошла исключительная ситуация (0x8002000b)»? гуглом пользоваться умею, но ответа так и не нашел.

    поправка, ексель 2010, работаем на терминалах по РДП, есть домен.

    Sheets — лист книги. может обращается к несущствующему?

    коллекция листов вообще-то

    от этого сильно смысл последнего предложения поменялся? код покажи-то. и где именно валится

    в смысле, от того что ты неправильное определение свойству дала? кстати, автор, Sheets — это не метод

    самое интересное, что под одним пользователем работает нормально, а под другим пользователем вываливает ошибку

    Тэги: 1С 8

    Комментарии доступны только авторизированным пользователям

  • shtucer-igor 04.03.2009 at 12:54

    однозначно плюс !

    а можно тоже самое но чтобы грузило в установку цен номенклатуры контрагента ?

    Reply

  • softbear 11.03.2009 at 00:25

    однозначно плюс !

    Reply

  • COMPER 19.03.2009 at 11:51

    не работает. Но красиво

    Reply

  • COMPER 19.03.2009 at 11:53

  • Pim 19.03.2009 at 19:10

    не работает :-(. Самый главный минус всех подобных обработок в том, что они грузят только одну цену в УТ. По крайней мере, я других не видел. Эта обработка похоже тоже грузит только одну цену, да ещё и запоролена…

    А что делать, если мне надо загружать сразу четыре разных типов цен в один документ. (Не надо предлагать загружать по-одному — заказчик не хочет).

    Reply

  • egorover 20.03.2009 at 16:26

    внимательней, там загрузка идёт по всем типам цен в строку

    Reply

  • olee 23.03.2009 at 00:40

    У меня пишет:

    {ВнешняяОбработка.ЗагрузкаЦен(7)}: Ошибка при вызове метода контекста (Sheets): Произошла исключительная ситуация (0x8002000b)

    по причине:

    Произошла исключительная ситуация (0x8002000b)

    Reply

  • egorover 23.03.2009 at 08:03

    всё времени нет, укажите имя листа excel Лист1

    Reply

  • olee 23.03.2009 at 10:39

    Создался пустой документ с комментарием из какого файла загружен.

    Пытаюсь снова загрузить цены — пишет в регистре есть такая строка.

    Захожу в регистр сведений — нет такой записи:(

    Reply

  • olee 25.03.2009 at 00:44

    Разобрался, все работает!

    Очень нужная обработка.

    Плюс.

    Reply

  • dev_gen 31.03.2009 at 13:35

    Ищу по всему инету такую разработку уже неделю.

    Огромное спасибище

    Reply

  • kozakm 11.04.2009 at 08:26

  • VikFx 28.04.2009 at 11:00

    то, что нужно, спасибо

    Reply

  • 4emodan 06.05.2009 at 01:22

    Большое спасибо! Давно искал.

    Reply

  • 4emodan 06.05.2009 at 01:39

    А можно сделать, чтоб находило товары не по артикулу, а по коду?

    Reply

  • petrash 06.06.2009 at 11:50

    Выручил! Спасибо большое!

    Reply

  • qwertylion@rambler.ru 07.06.2009 at 19:01

    Обработка хорошее но вот только документ пустой создается, не подскажите как быть?

    Reply

  • steelrat1976 20.06.2009 at 15:19

    нужно обязательно вводить коэффициент, если цена равна базовой, то коэффициент = 1 и тогда поля не пустые. Хотя можно было бы сказать сразу, а то сам часа два мучался пока не понял

    Reply

  • qwertylion@rambler.ru 26.06.2009 at 22:20

    при записи в ценообразование пустой лист

    Reply

  • qwertylion@rambler.ru 26.06.2009 at 22:22

    все нормально разобрался нужно обязательно вводить коэффициент, если цена равна базовой, то коэффициент = 1 и тогда поля не пустые. Хотя можно было бы сказать сразу, а то сам часа два мучался пока не понял СПАСИБО steelrat1976

    Reply

  • Dimka74 21.07.2009 at 04:29

    Пожалуй повторюсь: «А можно сделать, чтоб находило товары не по артикулу, а по коду?»

    Reply

  • sly99 07.10.2009 at 21:25

    можно поподробнее, что где писать?

    выдает ошибку

    {ВнешняяОбработка.ЗагрузкаЦен(7)}: Ошибка при вызове метода контекста (Sheets): Произошла исключительная ситуация (0x8002000b)

    по причине:

    Произошла исключительная ситуация (0x8002000b)

    Reply

  • cooldanie 06.11.2009 at 15:51

    Автор зачет! а можно по наименованию товара а не по артикулу? или сделайте универсально — по коду, по наименованию, по артикулу — и цены не будет вашей обработке. А если 2 колонки цены? опт и розница — 2я и 3я?

    Reply

  • helloworld 09.11.2009 at 14:31

    {ВнешняяОбработка.ЗагрузкаЦен(7)}: Ошибка при вызове метода контекста (Sheets): Произошла исключительная ситуация (0x8002000b)

    по причине:

    Произошла исключительная ситуация (0x8002000b)

    Это наверное когда страница Екселя названа не Лист1. Автор, выбрал бы просто первую страницу — Excel.Sheets(1).select();

    Reply

  • labuh 26.11.2009 at 03:38

    Автору респект и уважуха.

    А как быть с одинаковыми ценами номенклатуры? Обработка не читает одинаковые цены из экселя, — пишет «не нашли артикул ……..»

    Reply

  • labuh 27.11.2009 at 23:51

    Здесь что, больше никто не живет???

    Reply

  • meser 06.12.2009 at 22:22

    Спасибо, действительно обработка нужная, я бы добавил еще поиск не только по артиклу, но и по коду, наименованию.

    Reply

  • nikser 11.01.2010 at 18:40

    Ничего не понимаю . у кого она работает??? документ изменения цен то создался , но пустой .

    Reply

  • Epishko 14.02.2010 at 22:04

    Потратил массу времени — вбил артикулы, а в результате создает пустой документ. Жаль убитого воскресенья! Все-таки несмотря на обильные ссылки по поиску — эту задачку так пока никто и не решил качественно.

    Reply

  • Родная 14.04.2010 at 10:56

    изначально все получается, но при загрузке, выбранных цен в 1С выдается ошибка

    {ВнешняяОбработка.ЗагрузкаЦен(120)}: Ошибка при вызове метода контекста (Записать): Запись с такими ключевыми полями существует! : Закупочная : ******* (Регистр сведений: Цены номенклатуры; Номер строки: 43)

    по причине:

    Запись с такими ключевыми полями существует! : Закупочная :**********(Регистр сведений: Цены номенклатуры; Номер строки: 43)

    при том что справочник «Установка цен номенклатуры» пуст.

    Что я не так делаю?

    Reply

  • provnick 24.01.2011 at 21:39

    Да уж, было б описание, то немного времени потратить на заполнение формы, оказывается нужно файлик подготовить Excelский, страница Екселя названа должна Лист1 и артикул форматнуть в текстовой, а цены в числовой и заполняется таблица для передачи в документ. Но вопрос вот в чем: как две цены закинуть, поле то одно для выбора цены, у кого получилось? egorover пишет (6) «внимательней, там загрузка идёт по всем типам цен в строку» , но выходит только одна цена, что и как? Да еще пароль, понятно, а то…, что ж мышает второе поле для второй цены сделать, а? хоть бы приходную да расходную. В целом гуд и +, ще б поправить.

    Reply

  • Glenas 28.01.2011 at 14:46

    Здравсвуйте. Помогайте, очень надо. Версия 8,2, УТ 11. При открытии выдавал ошибку, поменял ТипыЦенНоменклатуры на ВидыЦен. Обработка открывается, загружает файл xls, корректно находит цены. При попытке загрузки выдаёт {ВнешняяОбработка.ЗагрузкаЦен.МодульОбъекта(90)}: Поле объекта не обнаружено (НеПроводитьНулевыеЗначения) А код модуля запаролен! Что делать, автор? Спасибо

    Reply

  • egorover 29.07.2011 at 10:03

  • lenka-nes@mail.ru 13.10.2011 at 10:19

    спасибо!пригодилось

    Reply

  • wwizard 01.11.2011 at 17:05

    Пишет Ошибка при вызове метода контекста (Sheets)

    Что делать?

    Reply

  • tgnike 08.11.2011 at 12:30

    Она со всеми екселями работате?

    Reply

  • w22u 21.11.2011 at 14:54

    Спасибо, протестируем Вашу обработку.

    Reply

  • Belka063 30.11.2011 at 09:30

    Работает.Спасибо.Помогло

    Reply

  • AruslanM 07.12.2011 at 10:41

    Спасибо за идею, пригодилось.

    Reply

  • Ibrogim 19.12.2011 at 10:51

    Спасибо за обработку, помогла как пример

    Reply

  • ASoft 18.01.2012 at 22:14

  • maratsat 21.01.2012 at 17:44

    Во-первых, хорошая обработка. Спасибо. Значительно сокращает время ввода документа.

    Во-вторых, предложения по улучшению

    Думаю было бы еще лучше, сделать ввод нескольких типов цен за один раз.

    Или как вариант сделать возможным добавлять разные типы цен к одному документу.

    А иначе получается, что розничные, оптовые и крупнооптовые цены в разных документах, что не удобно.

    Reply

  • wwizard 21.01.2012 at 23:25

    (35) так что делать то

    Reply

  • egorover 23.01.2012 at 21:18

    (42) так для этого и создавалось, колонки в таблице excel и есть различные типы цен

    Reply

  • egorover 23.01.2012 at 21:19

    (43) имя листа в книге excel

    Reply

  • FE_D_OR83 31.01.2012 at 15:11

    Спасибо за обработку,сэкономила время. Радует что каждый может доработать под себя.

    Кстати неплохо бы в неё добавить возможность указывать цены для номенклатуры с характеристиками.

    Reply

  • fonomo0 31.01.2012 at 15:24

    Автор С какими версиями Excel работает ваша отработка?

    Reply

  • AlexxxMksv 29.04.2012 at 12:17

    Скажите ваша обработка может проверять соответствие единицы измерения из файла не с базовой единицей, не с единицей хранения остатков, не с единицей для отчетов, не с единицей мест, а с единицами по классификатору?

    Reply

  • TitanLuchs 17.06.2012 at 13:20

    Замечательная штука, спасибо автору, помог сэкономить время на написание своего подобного «велосипеда»!

    Reply

  • MyPuK_OLD 19.11.2013 at 15:46

    Есть какое-то описание или инструкция по использованию данной обработки? Подойдет ли она для работы с Комплексной автоматизацией редакция 1.1?

    Reply

  • egorover 19.11.2013 at 21:23

    Пробуйте, не пробовал, код открыт

    Reply

  • Автор beztrud, 19 июн 2014, 23:26

    0 Пользователей и 1 гость просматривают эту тему.

    Цитировать
    1. Создаем реквизит формы Таблица
    2. Заполняем ее на клиенте (отключаемся от ADO)

    А если без реквизита Таблица — то я так понимаю можно использовать таблицу значений, а затем в табличную часть грузить из нее?


    Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


    Цитировать
    Все что надо это:
    1. Начальная строка
    2. Количество колонок
    3. Признак когда остановиться

    Можете привести код с пояснениями, пожалуйста.



    Попытка
    ФайлЭксель = ПолучитьCOMОбъект(ИмяФайла);
    Исключение
    ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке());
    Отказ = Истина;
    Возврат;
    КонецПопытки;

    СписокИмпорта.Очистить();

    счСтроки = НачальнаяСтрока;
    НомСтр = 0;

    Пока ИСТИНА Цикл 

    НомСтр = НомСтр + 1;

    ОбработкаПрерыванияПользователя();

    ПроверочнаяЯчейка = СокрЛП(ФайлЭксель.Sheets(1).Cells(СчСтроки,1).Value);

    Если ПроверочнаяЯчейка = "#" Тогда

    Прервать;

    КонецЕсли;

    Если ПроверочнаяЯчейка = "" Тогда

    Прервать;

    КонецЕсли;

    Состояние("Загрузка: строка №"+счСтроки);

    НоваяСтрока = СписокИмпорта.Добавить();

    НоваяСтрока.НомерСтроки = НомСтр;

    Для Ш=1 По СписокИмпорта.Колонки.Количество()-1 Цикл

    мКолонка = СписокИмпорта.Колонки.Получить(Ш);

    ЗначениеЯчейки = ФайлЭксель.Sheets(1).Cells(СчСтроки,Ш).Value;

    ЗаполнитьЗначениеПоТипуКолонки(ЗначениеЯчейки, НоваяСтрока[мКолонка.Имя], мКолонка);

    ОтформатироватьЗначениеПоля(ЗначениеЯчейки, НоваяСтрока[мКолонка.Имя], Ш); //очистим от ненужных символов и пр.

    КонецЦикла;

    счСтроки = счСтроки + 1;

    КонецЦикла;

    ФайлЭксель.Application.Quit();

    Получил помощь — скажи СПАСИБО.
    Разобрался сам — расскажи другим.


    ФайлЭксель = ПолучитьCOMОбъект(ИмяФайла);

    Если выбираем xls, то всё нормально, ну а если xlsx — то
    {Обработка.ВычислениеПластика.Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)
          ФайлЭксель = ПолучитьCOMОбъект(ИмяФайла);
    по причине:
    Ошибка получения объекта COM: -2147467259(0x80004005): Неопознанная ошибка

    Добавлено: 20 июн 2014, 21:31


    Кстати эта ошибка появляется при повторном выборе файла. При первом выборе ошибки нет, хоть и подгружает дольше, чем xls. Может быть проблема в

    ФайлЭксель.Application.Quit();

    Добавлено: 20 июн 2014, 21:59


    После многократных попыток выяснилось, что ошибка не имеет последовательности. Т.е. может вылезти а может и нет.


    Да такое поведение нормальное для конструкции

    ПолучитьCOMОбъект(ИмяФайла); если открыть файл закрыть и тут же снова открыть, на медленных компах процесс не успевает завершиться и ПолучитьCOMОбъект() подключается к существующему процессу снова, ну а процесс то уже не рабочий…

    СП
    Основное применение функции ПолучитьCOMОбъект — это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода:
    Таб = ПолучитьCOMОбъект(«C:DATADATA.XLS»);
    создает объект Excel.Application и открывает с его помощью файл документа «C:DATADATA.XLS». Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
    Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.

    Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


    cska-fanat-kz

    ПроверочнаяЯчейка = СокрЛП(ФайлЭксель.Sheets(1).Cells(СчСтроки,1).Value);
    Выдает
    {Обработка.ВычислениеПластика.Форма.Форма.Форма(72)}: Ошибка при вызове метода контекста (Cells)
          ПроверочнаяЯчейка = Эксель.Sheets(1).Cells(СчСтроки,2).Value;   
    по причине:
    Произошла исключительная ситуация (0x800a03ec)

    Dethmontt

    ЦитироватьДля файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.

    Это как?


    Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!


    cska-fanat-kz

    ЗаполнитьЗначениеПоТипуКолонки(ЗначениеЯчейки, НоваяСтрока[мКолонка.Имя], мКолонка);

    А это что за функция?

    Добавлено: 21 июн 2014, 08:43


    Вернемся все-таки к ADO. Уважаемый Dethmontt просьба помочь. У меня на форме есть ТабличнаяЧасть.Вычисления. Реквизиты этой табличной части — ЧастьИзделия, ВысотаФасада, ШиринаФасада, КоличествоФасадов. Есть файл эксель без наименования столбцов в первой строке, т.е в первой строке уже находятся данные. Структура файла эксель всегда одинакова во второй колонке файла эксель всегда содержится ЧастьИзделия, в четвертой колонке всегда ВысотаФасада, в пятой — ШиринаФасада и в шестой — КоличествоФасадов. Вы писали — 1. Создаем реквизит формы Таблица — т.е нужно создать на форме ТабличныйДокумент с именем Таблица и грузить в него? Или как?
    Все что пришло мне в голову это выбрать файл на клиенте а на сервере считать с него данные и передать на клиент. Но вот моя функция с переменной СтрокаТабличнойЧасти ругается, хоть и грузит данные. У меня к Вам просьба, если не сложно, выложите пожалуйста клиентскую и серверную процедуры для загрузки файла, применимо к моим реквизитам.


    Получил помощь — скажи СПАСИБО.
    Разобрался сам — расскажи другим.


    Автор Sweety Bell, 24 ноя 2015, 12:44

    0 Пользователей и 1 гость просматривают эту тему.

    Здравствуйте! Мне надо загрузить данные из excel в 8.2 обычное приложение. В цикле вывода возникает ошибка в методе Добавить. Первые 2 итерации пропускает нормально, потом выдает ошибку:
    НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов,ИмяКолонки);
    по причине:
    Недопустимое значение параметра (параметр номер ‘1’)

    Процедура ОкрытьФайлНажатие(Элемент)
       ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
       ДиалогВыбора.Заголовок ="Выберите файл";
       
    Если ДиалогВыбора.Выбрать()Тогда
       ИмяФайла=ДиалогВыбора.ПолноеИмяФайла;
      КонецЕсли ;

       Таблица.Очистить();
    Таблица.Колонки.Очистить();

    Попытка
    Excel=Новый COMОбъект("Excel.Application");
    Excel.WorkBooks.Open(ИмяФайла);
    Состояние("Обработка файла Excel");
    ExcelЛист=Excel.Sheets(1);
    Исключение
    Сообщить("шибка при открытии файла");
    Сообщить(ОписаниеОшибки());
    Возврат;
    КонецПопытки;


    Версия =Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия="8" Тогда
    ФайлСтрок =Excel.Cells.CurrentRegion.Rows.Count;
    ФайлКолонок =Макс(Excel.Cells.CurrentRegion.Columns.Count,13);
    Иначе
    ФайлСтрок =Excel.Cells(1,1).SpecialCells(11).Row;
    ФайлКолонок =Excel.Cells(1,1).SpecialCells(11).Column;
    КонецЕсли;

    Счетчик=1;
    Пока ЗначениеЗаполнено(Excel.Cells(1,Счетчик).Text)Цикл
    ИмяКолонки=Excel.Cells(1,Счетчик).Text;
    ИмяБезПробелов=СтрЗаменить(ИмяКолонки," ","");
    //Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);
    Таблица.Колонки.Добавить(ИмяКолонки);
    НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов,ИмяКолонки);
    НоваяКолонка.Данные=ИмяБезПробелов;
    Счетчик=Счетчик+1;
    КонецЦикла;

    Для нс=2 по Файлстрок Цикл
    НоваяСтрока=Таблица.Добавить();
    Для НомерКолонки=1 По Таблица.Колонки.Количество()Цикл
    ТекущееЗначение=Excel.Cells(нс.НомерКолонки).Text;
      ИмяКолонки=Таблица.Колонких[НомерКолонки-1].Имя;
      НоваяСтрока[ИмяКолонки]=ТекущееЗначение;



      КонецЦикла;
       КонецЦикла;

    КонецПроцедуры


    Смело запускайте отладчик. Он вам покажет название колонки.


    показал колонку Наименование.
    После этого на форме появляются 3 пустые колонки.
    Помогите, пожалуйста, вывести на экран. Начальство убивает:fdbsdfbsd:


    Вы слово «отладчик» сознательно не видите?


    Вижу. Он показывает на эту строку
    НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяКолонки);


    Цитата: Sweety Bell от 24 ноя 2015, 13:12
    Вижу. Он показывает на эту строку
    НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяКолонки);

    В приведенном вами коде нет такой строки. Есть такая:

    НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов,ИмяКолонки);


    Скажите, а что такое отладчик вы вообще знаете? Вывод строки с ошибкой и отладчик — это знаете ли, очень разные вещи.


    Цитата: vitasw от 24 ноя 2015, 13:25
    Скажите, а что такое отладчик вы вообще знаете? Вывод строки с ошибкой и отладчик — это знаете ли, очень разные вещи.

    инструмент для пошаговой отладки. Я им и пользуюсь. Значение смотрю на табло

    Добавлено: 24 ноя 2015, 13:47


    Оно зависает на этом месте кода

    ИмяКолонки=Excel.Cells(1,Счетчик).Text;


    ИмяКолонки=СокрЛП(Excel.Cells(1,Счетчик).Value);


    исправила. Теперь другая ошибка: Ошибка при вызове метода контекста (Cells)
          Пока ЗначениеЗаполнено(Excel.Cells(1,Счетчик).Value)Цикл
    по причине:
    Произошла исключительная ситуация (0x800a03ec)


    • Форум База

    • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

    • Конфигурирование, программирование в 1С Предприятие 8

    • загрузка данных из excel в 8.2

    Похожие темы (5)

    Рейтинг@Mail.ru

    Rambler's Top100

    Поиск

    Здравствуйте! Подскажите, пожалуйста! Загружаю из Excel данные, хочу обратиться к именованной области, выдает следующую ошибку: «Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
    ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
    по причине:
    Произошла исключительная ситуация (0x800a03ec)»

    Процедура ОсновныеДействияФормыЗагрузить(Кнопка)

    НомерКолонкиАртикул = ЭлементыФормы.ТабличныйДокумент.Область(«R2C1»;
    НомерКолонкиНаименованияТовара = ЭлементыФормы.ТабличныйДокумент.Область(«R2C2»;
    НомерКолонкиЕдиницаИзмерения = ЭлементыФормы.ТабличныйДокумент.Область(«R2C3»;
    НомерКолонкиСтрана = ЭлементыФормы.ТабличныйДокумент.Область(«R2C4»;

    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Excel = новый COMОбъект(«Excel.Application»;

    Версия = Лев(Excel.Version,Найти(Excel.Version,».»-1);
    Если Версия = «8» тогда
    ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
    ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
    ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
    ФайлКолонок = Excel.Cells(2,1).SpecialCells(21).Column;
    Конецесли;

    // Выбираем данные из файла
    Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

    //Полуим данные из соответсвующих ячеек
    Артикул = СокрЛП(Excel.Cells(а,Артикул).Value);
    НаименованиеТовара = СокрЛП(Excel.Cells(а,НомерКолонкиНаименованияТовара).Value);
    ЕдиницаИзмерения = СокрЛП(Excel.Cells(а,НомерКолонкиЕдиницаИзмерения).Value);

    Товар = Справочники.Номенклатура.ПустаяСсылка();

    // Ищем товар в справочнике по коду
    Товар = Справочники.Номенклатура.НайтиПоКоду.Артикул;

    // Если не нашли по коду, то ищем по наименованию
    Если Товар.Пустая() Тогда
    Товар = Справочники.Номенклатура.НайтиПоНаименованию.Наименование;
    Конецесли;

    //Если не нашли создаем новый
    Если Товар.Пустая() Тогда
    Товар = Справочники.Номенклатура.СоздатьЭлемент();
    Товар.Наименование = НаименованиеТовара;
    Товар.Артикул = Артикул;
    Товар.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;
    Товар.СтранаПроисхождения = НомерКолонкиСтрана;
    Товар.Записать();
    Конецесли;
    КонецЦикла;

    КонецПроцедуры

    I have an Excel VBA macro that I run once a week. I have a piece of code that filters out for different data and then copies the remaining cells to a different worksheet

    Here is the portion of effected code:

    dim data as worksheet
    dim sku vp as worksheet
    Set skuvp = Workbooks("weekly Brand snapshot report.xlsx").Sheets("SKU VP")
    set data = Workbooks("weekly Brand snapshot report.xlsx").Sheets("SKU Data")
    
    data.Range("A1").AutoFilter Field:=4, Criteria1:="Foods", Operator:=xlFilterValues
    data.Range("Onsales[[Product]]").SpecialCells(xlCellTypeVisible).Copy Destination:=skuvp.Range("B2")
    skuvp.Range("foods").Sort key1:=skuvp.Range("C1"), order1:=xlDescending, Header:=xlYes
    data.ShowAllData
    
    data.Range("A1").AutoFilter Field:=4, Criteria1:="Treats", Operator:=xlFilterValues
    data.Range("Onsales[[Product]]").SpecialCells(xlCellTypeVisible).Copy Destination:=skuvp.Range("H2")
    skuvp.Range("treats").Sort key1:=skuvp.Range("I1"), order1:=xlDescending, Header:=xlYes
    data.ShowAllData
    
    data.Range("A1").AutoFilter Field:=3, Criteria1:="Hardgoods", Operator:=xlFilterValues
    data.Range("B2:B16354").SpecialCells(xlCellTypeVisible).Copy Destination:=skuvp.Range("N2")
    skuvp.Range("hard").Sort key1:=skuvp.Range("O1"), order1:=xlDescending, Header:=xlYes
    data.ShowAllData
    
    data.Range("A1").AutoFilter Field:=3, Criteria1:="Specialty", Operator:=xlFilterValues
    data.Range("B2:B16354").SpecialCells(xlCellTypeVisible).Copy Destination:=skuvp.Range("T2")
    skuvp.Range("spcl").Sort key1:=skuvp.Range("U1"), order1:=xlDescending, Header:=xlYes
    data.ShowAllData
    

    Data and skuvp are set as worksheets.

    This code ran fine the very first time I ran it. However, it began having an error after that. The error appears on this line:

    data.Range("B2:B16354").SpecialCells(xlCellTypeVisible).Copy Destination:=skuvp.Range("N2")
    

    The error it gives is «Unable to get the Specialcells property of the range class.»

    I originally had the range in that code set the table column «Onsales[[Product]]» as the range like the previous 2 times I used the code but changed it to a set range to see if that would fix the issue.

    Why is this code having an error on that line when the same basic code works a few lines earlier?

    I’ve searched stackoverflow and other online sources for a solution without success.

     

    Добрый день.

    Столкнулся с такой проблемой: не могу найти пустые ячейки с помощью метода .SpecialCells(xlCellTypeBlanks)
    Диапазон точно пустой, так как он выбирается на только что созданном чистом листе. Он выбирается и… выдает ошибку при поиске пустых ячеек.
    При этом .SpecialCells(xlCellTypeConstants) тоже ничего не находит… Впрочем, как и поиск по формулам или еще по чему.

    Но стоит сделать .Clear, как пустые ячейки начинают определяться, как пустые…. Но что это за бред, какими они были до этого? Как мне найти пустые ячейки?

    Изменено: Vhodnoylogin21.04.2017 09:34:43

     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    Вы описываете как работали над чем-то… и это похоже был файлик со своими проблемами… Да?
    А где он? Или Вы думаете, что здесь моделируют проблемы по описанию, а потом рассказывают как их решить?  :D

     

    Vhodnoylogin

    Пользователь

    Сообщений: 44
    Регистрация: 27.09.2016

    #3

    21.04.2017 09:36:08

    Ничего не понял… Проблема либо есть, либо ее нет. Просто выберете

    Если нужен код (зачем?) — вот он:

    Код
    Public Sub hp_SetCopyFormates( _
                            ByRef acceptor As Range, _
                            ByRef donor_for_filled_cells As Range, _
                            ByRef donor_for_empty_cells As Range _
                        )
        With acceptor
            On Error GoTo errLabel1
            With .SpecialCells(xlCellTypeBlanks)
                donor_for_empty_cells.Copy
                .PasteSpecial xlPasteValidation
                .PasteSpecial xlPasteFormats
                .PasteSpecial xlPasteColumnWidths
                .PasteSpecial xlPasteFormulas
            End With
    nextLabel1:
            On Error GoTo errLabel2
            With .SpecialCells(xlCellTypeConstants)
                donor_for_filled_cells.Copy
                .PasteSpecial xlPasteValidation
                .PasteSpecial xlPasteFormats
                .PasteSpecial xlPasteColumnWidths
                .PasteSpecial xlPasteFormulas
            End With
        End With
    nextLabel2:
        Exit Sub
        
        '---------------------'
    errLabel1:
        Resume nextLabel1
    errLabel2:
        Resume nextLabel2
    End Sub
    

    Вставляйте любые диапазоны. Если Аксептор будет пустым полностью, то .SpecialCells(xlCellTypeBlanks) не сработает. И я спрашиваю — что делать?

    Изменено: Vhodnoylogin21.04.2017 09:53:11

     

    kuklp

    Пользователь

    Сообщений: 14868
    Регистрация: 21.12.2012

    E-mail и реквизиты в профиле.

    Я сам — дурнее всякого примера! …

     

    Пытливый

    Пользователь

    Сообщений: 4689
    Регистрация: 22.12.2012

    Может в шаблоне, на основании которого создается новый лист чего этого… .того… не то? :)

    Кому решение нужно — тот пример и рисует.

     

    Vhodnoylogin

    Пользователь

    Сообщений: 44
    Регистрация: 27.09.2016

    #6

    21.04.2017 09:46:28

    Да возьмите любой пустой диапазон и

    Код
    selection.SpecialCells(xlCellTypeBlanks).select
     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    Vhodnoylogin, в пределах .UsedRange
    Вернее нет, я не правильно выразился…
    Если нет ни одной используемой ячейки, то будет ошибка
    Достаточно закрасить даже цветом одну и все путем.

    Изменено: AAF21.04.2017 10:10:13

     

    V

    Пользователь

    Сообщений: 5077
    Регистрация: 22.12.2012

    зачем искать пустые ячейки на пустом листе?

     

    Vhodnoylogin

    Пользователь

    Сообщений: 44
    Регистрация: 27.09.2016

    #9

    21.04.2017 10:14:20

    Цитата
    AAF написал:
    Достаточно закрасить даже цветом одну и все путем.

    Недостаточно… Ведь смысл кода в том, чтобы запилить форматы для выбранного рейнджа…

    Чтобы работало, нужно дополнить код этим:

    Код
    If WorksheetFunction.CountA(acceptor) = 0 Then
                donor_for_filled_cells.Copy
                .PasteSpecial xlPasteValidation
                .PasteSpecial xlPasteFormats
                .PasteSpecial xlPasteColumnWidths
                .PasteSpecial xlPasteFormulas
            End If
     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    Вот если б Вы выложили файл…
    А то мне самому рисовать доноров и акцепторов?
    Вы четко представляете Вашу задачу и для Вас не сложно сделать это.
    Я сейчас не вижу проблем… В чем они?

     

    The_Prist

    Пользователь

    Сообщений: 14429
    Регистрация: 15.09.2012

    Профессиональная разработка приложений для MS Office

    #11

    21.04.2017 14:39:47

    Цитата
    Vhodnoylogin написал:
    Но стоит сделать .Clear, как пустые ячейки начинают определяться, как пустые

    возможно, повреждение книги. Такое поведение может быть в одном случае: в ячейках не пустые значения, а строки нулевой длины. Такое может наблюдаться при создании файлов путем выгрузки из 1С.
    Попробуйте сделать все в новом файле.

    Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

     

    Юрий М

    Модератор

    Сообщений: 60912
    Регистрация: 14.09.2012

    Контакты см. в профиле

    #12

    21.04.2017 15:07:09

    Цитата
    The_Prist написал:
    возможно, повреждение книги

    Дим, я в новой книге в А1 записал единичку, выделяю А1:А5, выполняю макрос

    Код
    Sub qqq()
        Selection.SpecialCells(xlCellTypeBlanks).Select
    End Sub
    

    и получаю ошибку с сообщением, что не найдено ни одной ячейки, удовлетворяющей указанным условиям.
    Мало того: F5 — выделить — Пустые ячейки, получаю аналогичное сообщение.
    Получается, что и у меня повреждена новая книга?

     

    The_Prist

    Пользователь

    Сообщений: 14429
    Регистрация: 15.09.2012

    Профессиональная разработка приложений для MS Office

    А, если вообще нет значений — это логично, т.к. диапазон рабочий пока еще только из одной ячейки(точнее — из ни одной :)) и любая конструкция SpecialCells будет ломаться, т.к. не работает для ни одной ячейки.
    Я обычно перед использованием SpecialCells проверяю сколько будет ячеек в необходимом диапазоне. И если только одна ячейка в рабочем диапазоне — то проверяю через свойства самой ячейки.

    Изменено: The_Prist21.04.2017 15:17:15

    Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

     

    Юрий М

    Модератор

    Сообщений: 60912
    Регистрация: 14.09.2012

    Контакты см. в профиле

    #14

    21.04.2017 15:21:42

    Цитата
    The_Prist написал:
    А, если вообще нет значений — это логично

    Но у меня ведь одна заполнена )

     

    Юрий М

    Модератор

    Сообщений: 60912
    Регистрация: 14.09.2012

    Контакты см. в профиле

    Заполнил А1 и А5, выделил А1:А5, выполнил макрос — выделено три ячейки А2:А4. Вывод: работает в пределах UsedRange. Так? )

     

    The_Prist

    Пользователь

    Сообщений: 14429
    Регистрация: 15.09.2012

    Профессиональная разработка приложений для MS Office

    #16

    21.04.2017 15:52:11

    Цитата
    Юрий М написал:
    работает в пределах UsedRange

    Да

    Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    #17

    21.04.2017 17:43:49

    Цитата
    Юрий М написал:
    работает в пределах UsedRange

    Нет….  :)

    Код
    Sub test1()
    'вот здесь будет ошибка
    Sheets.Add
    Range("A1") = 1
    Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks)
    Rng.Select
    End Sub
    Sub test2()
    'вот здесь иллюстрация работы .SpecialCells(xlCellTypeBlanks)
    Sheets.Add: Range("B2") = 1
    Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
    For i = 1 To Rng.Areas.Count
      s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
    Next
    MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s: s = ""
    Sheets.Add: Range("C3:G7") = 1
    Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
    For i = 1 To Rng.Areas.Count
      s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
    Next
    MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s: s = ""
    Sheets.Add: Range("C3:G7") = 1
    Range("F6:H8").EntireRow.Rows.Hidden = True
    Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
    For i = 1 To Rng.Areas.Count
      s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
    Next
    MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s
    'стоит обратить внимание и на это поведение SpecialCells
    s = "xlCellTypeLastCell    " & Cells(1).SpecialCells(xlCellTypeLastCell).Address
    Set usRng = ActiveSheet.UsedRange
    Set curReg = Range("C3:G7")
    MsgBox s & vbCrLf & "последняя UsedRange    " & usRng.Cells(usRng.Rows.Count, usRng.Columns.Count).Address _
      & vbCrLf & "последняя CurRegion    " & curReg.Cells(curReg.Rows.Count, curReg.Columns.Count).Address
    End Sub
    

    Изменено: AAF21.04.2017 18:02:08

    Если ваш макрос выдаёт ошибку при использовании метода SpecialCells — возможно, причина в установленной защите листа Excel.

    Почему разработчики Microsoft отключили работу этой функции на защищённых листах — не совсем понятно, но мы попробуем обойти это ограничение.

    Итак, нам надо получить все заполненные ячейки из некого диапазона листа Excel. 

    Обычно для этого используется вызов метода SpecialCells — например,

    msgbox Range("a2:d8").SpecialCells(xlCellTypeConstants).Address

    Но на защищенном листе такой код выдаст ошибку 1004.

    Чтобы избавиться от ошибки, мы используем функцию SpecialCells_TypeConstants — замену встроенному методу SpecialCells(xlCellTypeConstants)

    Function SpecialCells_TypeConstants(ByRef ra As Range) As Range
        ' возвращает диапазон, содержащий все заполненные ячейки диапазона ra
        On Error Resume Next: en& = Err.Number
        If ra.Worksheet.ProtectContents Then    ' если лист защищён
            Dim cell As Range
            ' перебираем все ячейки в диапазоне
            For Each cell In Intersect(ra, ra.Worksheet.UsedRange).Cells
                If Trim(cell.Value) <> "" Then    ' если ячейка непустая
                    ' то добавляем её в результат
                    If SpecialCells_TypeConstants Is Nothing Then
                        Set SpecialCells_TypeConstants = cell
                    Else
                        Set SpecialCells_TypeConstants = Union(SpecialCells_TypeConstants, cell)
                    End If
                End If
            Next cell
     
        Else    ' если защита листа не установлена - используем штатные средства Excel
            Set SpecialCells_TypeConstants = ra.SpecialCells(xlCellTypeConstants)
        End If
        If en& = 0 Then Err.Clear
    End Function

    Теперь наш код (работающий в т.ч. и на защищённых листах) будет выглядеть так:

    msgbox SpecialCells_TypeConstants(Range("a2:d8")).Address

    Аналогичная функция, если нам надо получить диапазон видимых (нескрытых) строк на листе Excel: 

    (замена для SpecialCells(xlCellTypeVisible))

    Function SpecialCells_VisibleRows(ByRef ra As Range) As Range
        On Error Resume Next: en& = Err.Number
        If ra.Worksheet.ProtectContents Then
            Dim ro As Range
            For Each ro In Intersect(ra, ra.Worksheet.UsedRange.EntireRow).Rows
                If ro.EntireRow.Hidden = False Then
                    If SpecialCells_VisibleRows Is Nothing Then
                        Set SpecialCells_VisibleRows = ro
                    Else
                        Set SpecialCells_VisibleRows = Union(SpecialCells_VisibleRows, ro)
                    End If
                End If
            Next ro
        Else
            Set SpecialCells_VisibleRows = ra.SpecialCells(xlCellTypeVisible)
        End If
        If en& = 0 Then Err.Clear
    End Function

    Понравилась статья? Поделить с друзьями:
  • Ошибка плагина 2349 как устранить
  • Ошибка получения контрольного вопроса биллинг недоступен мосэнергосбыт
  • Ошибка при вызове метода контекста sheets
  • Ошибка при вызове метода контекста run
  • Ошибка получения контрольного вопроса биллинг недоступен мособлеирц