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