Имя: Пароль:
1C
1С v8
В очередной раз ЭКСЕЛЬ!!!
,
0 mzelensky
 
23.03.12
09:43
Пришлось создать новую тему, у старой видимо карма плохая.

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

СтрокаЕдиницыИзмерения="";
           Запрос=новый запрос;
           Запрос.Текст="ВЫБРАТЬ
           |    КлассификаторЕдиницИзмерения.Ссылка,
           |    КлассификаторЕдиницИзмерения.Наименование КАК Наименование,
           |    КлассификаторЕдиницИзмерения.МеждународноеСокращение КАК МСокр
           |ИЗ
           |    Справочник.КлассификаторЕдиницИзмерения КАК КлассификаторЕдиницИзмерения
           |ГДЕ
           |    КлассификаторЕдиницИзмерения.ПометкаУдаления = ЛОЖЬ
           |
           |УПОРЯДОЧИТЬ ПО
           |    Наименование
           |АВТОУПОРЯДОЧИВАНИЕ";
           Выборка=Запрос.Выполнить().Выбрать();
           Пока выборка.Следующий() цикл
               СтрокаЕдиницыИзмерения=СтрокаЕдиницыИзмерения+", "+СокрЛП(выборка.Наименование);

           КонецЦикла;
           СтрокаЕдиницыИзмерения=Сред(СтрокаЕдиницыИзмерения,3);

...
...
...

MR = Книга.VBProject;
           NM = MR.VBComponents.Add(1);
           NM.CodeModule.InsertLines(1,"Sub Макрос_СписокЗначенийЕдИзм()");
//ПИШЕМ МАКРОС ДЛЯ ФОРМИРОВАНИЯ СПИСКА ЗНАЧЕНИЙ ЕДИНИЦ ИЗМЕРЕНИЯ
               NM.CodeModule.InsertLines(ПНСт,"        Range(Cells(2, "+строка(СчКолонка-1)+"),Cells(10, "+строка(СчКолонка-1)+")).Select");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"        With Selection.Validation");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .Delete");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            xlBetween, Formula1:="""+ СтрокаЕдиницыИзмерения +""" ");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .IgnoreBlank = True");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .InCellDropdown = True");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .InputTitle = """);
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .ErrorTitle = """);
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .InputMessage = """);                
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .ErrorMessage = """);
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"            .ShowInput = True");
               ПНСт=ПНСт+1;
               NM.CodeModule.InsertLines(ПНСт,"        End With");
               ПНСт=ПНСт+1;
//ВЫПОЛНЯЕМ МАКРОС
           NM.CodeModule.InsertLines(ПНСт,"End Sub");
           Эксель.Run(Книга.Name+"!Макрос_СписокЗначенийЕдИзм");

Косяк в том, что переменная "СтрокаЕдиницыИзмерения" (которая представляет собой строку с перечисленными единица измерения) имеет довольно большую длину (порядка 500 символов), а эксель в этом макросе воспринимает только 256 символов...все остальное он просто обрезает. Как результат список получается не полный. КАК БЫТЬ???

Старая тема: v8: Еще один вопросик по экселю
1 Tatitutu
 
23.03.12
09:51
NM.CodeModule.InsertLines(1,"Range(Cells(2, "+строка(СчКолонка-1)+"),Cells(10, "+строка(СчКолонка-1)+")).Select");
               NM.CodeModule.InsertLines(2,"With Selection.Validation");
               NM.CodeModule.InsertLines(3,".Delete");              
               NM.CodeModule.InsertLines(4,".Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _");              
               NM.CodeModule.InsertLines(5,"xlBetween, Formula1:="""+ СтрокаЕдиницыИзмерения +""" ");                
               NM.CodeModule.InsertLines(6,".IgnoreBlank = True");              
               NM.CodeModule.InsertLines(7,".InCellDropdown = True");                
               NM.CodeModule.InsertLines(8,".InputTitle = """);                
               NM.CodeModule.InsertLines(9,".ErrorTitle = """);              
               NM.CodeModule.InsertLines(10,".InputMessage = """);                
               NM.CodeModule.InsertLines(11,".ErrorMessage = """);
               NM.CodeModule.InsertLines(12,".ShowInput = True");              
               NM.CodeModule.InsertLines(13,"End With");


какую задачу ты преследуешь ? что то мне кажется - изобретаешь велосипед почем зря, все можно сделать намного проще и изящнее
2 mzelensky
 
23.03.12
10:04
(1) я пробовал делать через диапазон, как ты мне давал пример, но тут минус - этот самый диапазон ДОЛЖЕН ПРИСУТСТВОВАТЬ в книге экселя, т.е. этот самый списко единиц измерения я должен забить в ячейки листа, а потом по нему сделать список...при этом если я потом очищу ячейки ,то соответственно очищу и список. МНЕ ЭТО НЕ ПОДХОДИТ.

NM.CodeModule.InsertLines(5,"xlBetween, Formula1:="""+ СтрокаЕдиницыИзмерения +"""

- таким образом я статически забиваю значения в список (просто через запятую). Все рабоотает, но вот это ограничение на 256 символов меняубивает. Пробовал делать перенос строки - не помогает.
3 mzelensky
 
23.03.12
10:06
т.е.

NM.CodeModule.InsertLines(5,"xlBetween, Formula1:="""+ СтрокаЕдиницыИзмерения +"""

равно

NM.CodeModule.InsertLines(5,"xlBetween, Formula1:=""штука, Килограмм, грамм,тонна, метр, километр, сантиметр ... ""
4 МихаилМ
 
23.03.12
10:06
лучше так не писать

не поленитесь в надите файлик с описанием костант вба
(lValidateList,xlBetween..)

автомешн модель ms offise на 99% открытая.

научитесь пользоваться objectBrowser
(можно вызвать из редакторов вба,ms vishualstudio)
скорее всего значения списка можно культурно заполнить
через comsafeArray
5 mzelensky
 
23.03.12
10:13
(4) а примеры подобного есть?!
6 mzelensky
 
23.03.12
10:24
блин, вот вроде простой вопрос...простая потребность и желание сделать список в ячейке...а столько гемороя...
7 mzelensky
 
23.03.12
11:10
ЛЮД!!!
8 mzelensky
 
23.03.12
12:31
gh
9 mzelensky
 
23.03.12
14:04
YFHJJJL!
10 FN
 
23.03.12
16:11
В примере ниже используется список значений, находящийся в определенной колонке (ОбластьЗначений)

Думаю по аналогии сделаешь
                           Ексель.Range(Область).Validation.Add(3,1,1,("="+ОбластьЗначений));
                           Ексель.Range(Область).Validation.IgnoreBlank=1;
                           Ексель.Range(Область).Validation.InCellDropdown=1;
                           Ексель.Range(Область).Validation.ShowInput=0;
                           Ексель.Range(Область).Validation.ShowError=1;
11 mzelensky
 
23.03.12
16:16
(10) Не совсем понял ,что здесь есть "ОбластьЗначений" ???
12 FN
 
23.03.12
16:18
(10)+ упс, дочитал (0)

(11) ОбластьЗначений="$"+ПолучитьНазваниеКолонки(СчетчикКолонок)+"$"+Строка(65535-КвоЭлементов)+":"+"$"+ПолучитьНазваниеКолонки(СчетчикКолонок)+"$"+Строка(65535);

Ссылка на ячейки со значениями.
Можешь использовать скрытый лист для этого
13 mzelensky
 
23.03.12
16:20
(12) да вот хотелось бы без этого скрытого листа :(
14 mzelensky
 
23.03.12
16:20
(12) А как скрытый лист сделать?
15 FN
 
23.03.12
16:26
(14) добавляешь лист  и делаешь Лист.Visible(0) или Лист.Visible=0 - поиграйся
16 mzelensky
 
23.03.12
16:28
(15) ну не ужели нельзя БЕЗ этого сделать??? на пряму передать значения в список, без заполнения дополнительных данных
17 mzelensky
 
23.03.12
16:30
(12) а можешь текст этой функции дать:
"ПолучитьНазваниеКолонки(СчетчикКолонок)" ?
18 FN
 
23.03.12
16:30
/Функция возвращает буквенный код столбца по его номеру
Функция ПолучитьНазваниеКолонки(Знач ном)  //от 1 до 255
   ном=Макс(1,Мин(ном,255)); //ограничим
   ном=ном-1;
   ПоследнийСимвол=Симв(65+(ном%26));
   ПервыйСимвол=?(Цел(ном/26)=0,"",Симв(64+Цел(ном/26)));
   Возврат(ПервыйСимвол+ПоследнийСимвол);                                                  
КонецФункции
19 mzelensky
 
23.03.12
16:31
(18) спасибо!
20 FN
 
23.03.12
16:32
+ как пример смотри http://infostart.ru/public/16140/
21 FN
 
23.03.12
16:32
(20)+ я там много комментариев писал
22 mzelensky
 
23.03.12
16:42
(18) а что-то нифига он мне не дает построить список по диапазону с другого листа...
23 mzelensky
 
23.03.12
16:43
(22) я даже в просто в экселе это не могу сделать (хотел макрос записать), а он дает выбрать диапазон только из текущего листа
24 mzelensky
 
23.03.12
16:45
(20) что-то открыть не получается. Ссылку проверь.
25 Lama12
 
23.03.12
16:48
(0) а Ексель какой версии?
26 FN
 
23.03.12
16:48
(23) да просто пишешь что-то типа =Лист2!R[-3]C:RC
27 Tatitutu
 
23.03.12
17:19
(22)

руками он дает только выбрать на текущем листе
но это можно обойти , уже в третий раз тебе пишу:


можно все намного проще , сделай программно из 1С

//в ячейки с А1 по А10 забей свои значения

//этим ячейкам присвоим новое имя

Range(Cells(1, 1), Cells(10, 1)).Name = "НужныйСписок"
//в нужной ячейке добавим выбор из нужного списка    

Range("B13").Validation.Add 3, 1, 1, "=НужныйСписок"
//все !
28 FN
 
23.03.12
17:20
(27) браво!
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан