Страницы: 1
RSS
Определение связи в формулах кодом VBA, Распознание связей в формулах согласно структуры формулы связи
 
Всем привет!
Помогите, пожалуйста, по одному вопросу, связанному с кодовым распознанием, наличия связи в формулах.
И мне нужно, что бы код не просто определял наличие связи, но и еще и то, какого масштаба связь: в рамках одного листа, одного файла или это связь на внешний другой файл.
Для этого, я решил сделать следующим образом:
'----------------------------------------------------------------------------
Sub ConectionRecognizeInsideFormul()
strWorkBookName = "*"
strSheetName = "Лист 1"
strRange = "*"
'---------------------------------
ConectionSimpleCase_FileInside_Type1 = "=" & strSheetName & "!" & strRange & "*"
ConectionSimpleCase_FileInside_Type2 = "='" & strSheetName & "'!" & strRange & "*"
'------
ConectionTextInsideCase_FileInside_Type1 = "=""*""&" & strSheetName & "!" & strRange & "*&""*"""
ConectionTextInsideCase_FileInside_Type2 = "=""*""&'" & strSheetName & "'!" & strRange & "*&""*"""
'------
'ConectionSimpleCase_FileOutsideOpened_Type2 = "='[" & strWorkBookName & "]" & strSheetName & "'!" & strRange & ""
ConectionSimpleCase_FileOutsideOpened_Type2 = "='[*]Лист 1'!*"  ' без имени файла показывает true: "=*Лист 1'!*"
'------
'ActiveCell.FormulaR1C1 = "='[Имяфайла.xlsx]Лист 1'!R2C2"
'MsgBox ActiveCell.Formula = ConectionSimpleCase_FileOutsideOpened_Type2

MsgBox ActiveCell.Formula Like ConectionSimpleCase_FileOutsideOpened_Type2 ' ПОЧЕМУ НЕ ВЫДАЕТ True? Блин! (Структуру имени файла не воспринимает)
End Sub
'----------------------------------------------------------------------------

По внутренним связям (в рамках самого файла) все получается, а по связям со внешнего другого файла нет. И дело стопориться на следующем коде,
при следующем, для примера тексте формулы в активной ячейке: “='[Имяфайла.xlsx]Лист 1'!$В$2":

MsgBox ActiveCell.Formula Like "='[*]Лист 1'!*"

Сообщение кода выдает результат:  False
Блин! Не могу понять почему?

Для указанного примера текста ячейки структура: Like"='[*]Лист 1'!*" указана правильно!

Я это уже проверил командой
ActiveCell.Formula = "='[Имяфайла.xlsx]Лист 1'!$В$2"
Ссылка нормально вводится при открытом файле с именем: “Имяфайла.xlsx”
Так что, не могу понять, почему: Like"='[*]Лист 1'!*" для указанного текста формулы выдает:  False, а по идее должна выдавать: True!
Как только не пробовал, все без толку.
Главное, когда в коде убираю частицу: [*]  и ставлю звездочку, т.е. делаю так: Like"='*Лист 1'!*"   тогда все нормально! Выдает True!

Поэтому! Ну, ничего не пойму!
Че за дебилизм и кляуза этого языка VBA. Костлявого и не знаю еще какого.
Или может я че то не до понимаю или не знаю?
Прошу помощи у грамотных людей.

Буду признателен за ответ!
Изменено: Gigi - 04.03.2015 13:53:45
 
Gigi, код следует оформлять соответствующим тегом. Исправляйте.
 
Gigi, [*] - это сама звездочка, Вам надо [[]*[]]
Код
?"='[Имяфайла.xlsx]Лист 1'!$В$2" like "*[[]*[]]Лист 1*"
True
 
Спасибо большое!
Накладка устранена!
Все нормально работает. И выдает True!
Надо же! Чуть не тот код и уже едва ли работало.
Но символы: "[" "]"       это как я понимаю, элемент обозначения языка VBA:                    
       ? - любой символ (один);
       #- одна цифра (0-9);
      [<список>] - символ, совпадающий с одним из символов списка;
      [!<список>] - символ, не совпадающий ни с одним из символов списка.
И поэтому ошибка была в том, что у меня символы "[" "]" представляли собой не константы, а символы самого VBA.
Просто как некоторые статьи пишут. Читаешь учебник или статью, а там все так скупо описано, много теории и нет практики. Не примеров, не задач! Ничего. Одна теория и просто болтовня. Все поверхностно и без важных деталей.
Читал пару статей про операции со строками, пишут про команду Likeи  про символ “*”, как обозначение команды, но при этом вообще не пишут про другие символы VBA, на пример "[" "]". А если пишут, то без примеров. Ну если ты пишешь про команду Likе “*”,  напиши и про "[" "]". И с примерами. И дай полную картину и коротко и понятно. Кому как не тебе автору статьи не знать, что написав про Likе “*”,   и не написав  про "[" "]"  как символы команды, изучающий неминуемо столкнется с той, с проблемой с которой я столкнулся.
Теперь этот код работает на все случая наличия связи в формулах. Или почти на все.
Скидываю, его если кто-то столкнется с аналогичной же проблемой.

Sub ConnectionRecognizeInsideFormul()
strWorkBookAddress = "*"
strWorkBookName = "*"
strSheetName = "Лист1"
strRange = "*"
'--------------------------------
ConnSheetNameRangePart_Type1 = strSheetName
&
"!" & strRange
ConnSheetNameRangePart_Type2 = "'" & strSheetName
&
"'!" & strRange
ConnFileSheetNameRangePart_Type1 = "[[]" & strWorkBookName
&
"[]]" & ConnSheetNameRangePart_Type1
ConnFileNameSheetNameRange_Type2 = "'[[]" & strWorkBookName
&
"[]]" & ConnSheetNameRangePart_Type2
ConnFileAddressNameSheetNameRange = "'" & strWorkBookAddress & "[[]" & strWorkBookName
&
"[]]" & strSheetName
&
"'!" & strRange
'--------------------------------
ConnSimpleCase_FileInside_Type1 = "=" & ConnSheetNameRangePart_Type1 & "*"
ConnSimpleCase_FileInside_Type2 = "=" & ConnSheetNameRangePart_Type2 & "*"
'------
ConnTextInsideCase_FileInside_Type1 = "=""*""&" & ConnSheetNameRangePart_Type1 & "&""*"""
ConnTextInsideCase_FileInside_Type2 = "=""*""&" & ConnSheetNameRangePart_Type2 & "&""*"""
'-----------
'ConnSimpleCase_FileOutsideName_Type1
= "=[[]*[]]
Лист1!*"
ConnSimpleCase_FileOutsideName_Type1 = "=" & ConnFileSheetNameRangePart_Type1
ConnSimpleCase_FileOutsideName_Type2 = "=" & ConnFileSheetNameRangePart_Type2
'------
ConnSimpleCase_FileOutsideAddressName = "=" & ConnFileAddressNameSheetNameRange
'------
ConnTextInsideCase_FileOutsideName_Type1 = "=""*""&" & ConnFileSheetNameRangePart_Type1 & "&""*"""
ConnTextInsideCase_FileOutsideName_Type2 = "=""*""&" & ConnFileSheetNameRangePart_Type2 & "&""*"""
ConnTextInsideCase_FileOutsideAddressName = "=""*""&" & ConnFileAddressNameSheetNameRange & "&""*"""
'------
MsgBoxActiveCell.FormulaLikeConnTextInsideCase_FileOutsideAddressName
End Sub
Ладно! Еще раз спасибо!
Изменено: Gigi - 05.03.2015 15:13:09
 
Цитата
Gigi написал: Ну если ты пишешь про команду Likе “*”,  напиши и про "[" "]". И с примерами. И дай полную картину и коротко и понятно
Ну здесь Вы перегибаете явно. Никто Вам не должен доносить абсолютно все, да еще и в понятной именно Вам манере :-) Коротко и понятно для каждого по-разному звучит, поверьте. К тому же нельзя учесть абсолютно все нюансы. Плюс неизвестно где Вы и чего читали. Может человек и не пытался донести все нюансы оператора Like, а имел ввиду конкретную ситуацию. А может человек, написавший статью и сам не знал всех нюансов и просто хотел поделиться тем, что знает. Не надо быть столь критичным к другим.
Цитата
Gigi написал: но при этом вообще не пишут про другие символы VBA, на пример "[" "]"
Вы справку VBA открывали по оператору Like? Там все есть: и скобки, и звездочки, и вопр.знак. Однако конкретно Ваша ситуация там тоже не описана. Но написано следующее:
To match the special characters left bracket ([), question mark (?), number sign (#), and asterisk (*), enclose them in brackets. The right bracket (]) can't be used within a group to match itself, but it can be used outside a group as an individual character.

Попробуйте для начала написать свою статью - увидите, всегда найдутся те, кому чего-то там будет не хватать. Так уж устроен мир - всегда найдется ситуация, которая еще нигде не встречалась ранее и поэтому не описана. И это хорошо ведь, согласитесь. Если бы все все знали - было бы скучно жить :-)

P.S. Для оформления кодов есть кнопочка <...>. Исправьте свои сообщения, пожалуйста. Вам об этом другой модератор уже писал, но Вы почему-то игнорируете.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх