Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 14 дек 2018, 10:02

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме используйте имена файлов содержащих латиницу !



Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 14:23 
Не в сети
Бывалый

Зарегистрирован: 19 июн 2015, 22:18
Сообщений: 101
Использую Visio c: 2013
Очков репутации: 21

Добавить очки репутацииУменьшить очки репутации
У меня в одной фигуре есть три значения User-defined cell:
= "test"
=NOW()
=PAGECOUNT()

Т.е. - строка, дата и число.
Как мне перенести значения из этих ячеек в User-defined cell другой фигуры. Будем считать, что заранее тип данных я не знаю источника я не знаю.
Если переносит так:

Код:
res = Shape2.ResultStrU(0)
MainGroup.Cells(FullPropName).FormulaU = """" & res & """"


то все значения у меня превратятся в строки, а мне нужно перенести именно значения, сохранив тип данных. Формулы мне переносить не нужно.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 14:40 
когда в шейпшите вставляешь формулу, ядро визио само определяет тип данных. а почему вы не хотите передавать формулу ?


Пожаловаться на это сообщение
Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 14:55 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1209
Очков репутации: 100589

Добавить очки репутацииУменьшить очки репутации
Типа, сначала создать себе трудности, а потом героически с ними бороться...
А нельзя вместо User-defined использовать Shape Data? Там тип в отдельной ячейке хранится.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 15:06 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Tumanov писал(а):
Типа, сначала создать себе трудности, а потом героически с ними бороться...
похоже концепция поменялась !!!
vin в сообщении #7346 писал(а):
Очень хотелось обойтись без макросов - одними формулами.
похоже vin решил все сделать макросами :)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 15:39 
Не в сети
Бывалый

Зарегистрирован: 19 июн 2015, 22:18
Сообщений: 101
Использую Visio c: 2013
Очков репутации: 21

Добавить очки репутацииУменьшить очки репутации
Гость писал(а):
когда в шейпшите вставляешь формулу, ядро визио само определяет тип данных. а почему вы не хотите передавать формулу ?

Не хотел долго объяснять зачем мне это нужно.
Как пример - в ячейке хранится NOW(), а в фигуру мне нужно кинуть дату-константу, а не формулу.

Tumanov писал(а):
А нельзя вместо User-defined использовать Shape Data? Там тип в отдельной ячейке хранится.

Уже думал над этим. Возможно так и придется сделать.
Но все же - есть ячейка, она вычисляет результат (результат - скорее всего переменная типа variant), но потом же можно вычислить тип - VarType.
А здесь получается - нельзя! Т.е. ты заранее должен знать тип данных. А если там формула меняется (напрмер возвращает то строку, то дату, то число)?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 16:26 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 897
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 121

Добавить очки репутацииУменьшить очки репутации
что-то мне кажется, что подход в корне не правильный. наверно не надо делать так, чтобы нельзя было понять, что у тебя в ячейке. короче, все в кучу валить нехорошо. я бы выделил для определенного результата нужную ячейку. и уж точно NOW() и PAGECOUNT() не смешивал.
время из ячейки читать через .Result(visDate).
PAGECOUNT() и число можно объединить и читать через .ResultIU
ну и отдельно строки читать.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 16:29 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
vin писал(а):
А здесь получается - нельзя! Т.е. ты заранее должен знать тип данных. А если там формула меняется (напрмер возвращает то строку, то дату, то число)?
это в шейпшите некоторые ячейки могут принимать значения разных типов, думаю что в программировании тип придется указывать явно !


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 17:04 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 593
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100603

Добавить очки репутацииУменьшить очки репутации
Да вроде это никак не сделать.
Допустим, с датой что получается? Ты хочешь чтобы формула "NOW()" превратилась в формулу (!) "DATETIME(42213.62392361)"
Вряд ли это может как-то случиться автоматически.

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 17:13 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
setf для передачи значения из одной ячейки в другую рулит :)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 17:52 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Если очень хочется все сделать программно.
Код:
Sub For_vin()
Dim ss As Shape, cl As Cell, str$, pr$
Set ss1 = ActiveWindow.Selection(1) ' шейп источник
pr = ""
Set ss2 = ActiveWindow.Selection(2) ' шейп приемник
For i = ss1.RowCount(242) - 1 To 0 Step -1 ' перебор свойств шейпа источника
Set cl = ss1.CellsSRC(visSectionUser, i, visUserValue)
Debug.Print TypeName(cl.Result(visUIObjSetDrawing))
    row_name = ss1.CellsSRC(visSectionUser, i, visUserValue).RowNameU
    If Len(str) > 0 Then pr = "+"
    str = str & pr & "setf(getref(sheet." & ss2.ID & "!user." & row_name & "),user." & row_name & ")"
Next
ss1.AddNamedRow visSectionUser, "set", visTagDefault ' добавление нового свойства в шейп источник, для изменения в шейпе источнике
ss1.Cells("user.set").FormulaU = str ' применение формулы в шейпе источнике
ss1.DeleteRow visSectionUser, ss1.RowCount(242) - 1 ' удаление последнего свойства из шейпа источник
End Sub
для простоты считал, что у шейпа приемника уже есть все свойства шейпа источника


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 19:17 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 593
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100603

Добавить очки репутацииУменьшить очки репутации
Попробуй с NOW() - оно не дату, оно цифру пишет.

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 19:20 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 593
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100603

Добавить очки репутацииУменьшить очки репутации
А не, все правильно! Т.е. пишется дата. Супер, обхитрил-таки Visio! :D

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 28 июл 2015, 23:52 
Не в сети
Бывалый

Зарегистрирован: 19 июн 2015, 22:18
Сообщений: 101
Использую Visio c: 2013
Очков репутации: 21

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
Если очень хочется все сделать программно.

Гениально!
Великолепная идея - использовать setf. Когда Вы в первый раз на это намекнули, то я подумал, что это прикол. А оказалось - нет!
Я все искал - не могу ли использовать формулы Visio подобно тому, как можно использовать формулы в Excel в VBA. Но увы - нет.
А вот дошел бы сам до подобной установки значения - не знаю. Скорее начал бы делать то, что советовали раньше - "помнить" в каких ячейках у меня какой тип, или использовать тип из UserProp и т.д.
А тут - все универсально!
Спасибо!


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 29 июл 2015, 11:48 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
семья на даче - вечером мне было грустно и одиноко… поэтому решил допилить это, чтоб все было по честному Изображение
Код:
Sub vin()
Dim sh As Shape
Set sh = ActiveWindow.Selection(1)
Dim nsh As Shape
Set nsh = ActivePage.Shapes.ItemFromID(2)
For i = sh.Section(242).Count - 1 To 0 Step -1
    ROW_NAME = sh.CellsSRC(visSectionUser, i, visUserValue).RowNameU
    row_value = sh.CellsSRC(visSectionUser, i, visUserValue).ResultStr("")
    If IsDate(row_value) Xor IsNumeric(row_value) Then ' если в ячейке дата
    VL = sh.CellsSRC(visSectionUser, i, visUserValue)
    VL = "DATETIME(" & VL & ")"
    nsh.Cells("USER." & ROW_NAME).FormulaU = VL
    Else
    If IsNumeric(row_value) Then  ' если в ячейке число
    VL = sh.CellsSRC(visSectionUser, i, visUserValue).ResultIU
    nsh.Cells("USER." & ROW_NAME).FormulaU = VL
    Else  ' если в ячейке строка
    VL = sh.CellsSRC(visSectionUser, i, visUserValue).ResultStr("")
    nsh.Cells("USER." & ROW_NAME).FormulaU = Chr(34) & VL & Chr(34)
    End If
    End If
Next
End Sub
nbelyh в сообщении #7405 писал(а):
Да вроде это никак не сделать.
Допустим, с датой что получается? Ты хочешь чтобы формула "NOW()" превратилась в формулу (!) "DATETIME(42213.62392361)"
Вряд ли это может как-то случиться автоматически.
да тут хохма в том, что когда VBA считывает содержимое ячейки содержащей дату как строку, это значение одновременно определяется как дата (IsDate = True) и как число (IsNumeric = True)
т.к. записана как 42213.62392361). Поэтому код отлова дат в ячейке такой
Код:
row_value = sh.CellsSRC(visSectionUser, i, visUserValue).ResultStr("")
If IsDate(row_value) Xor IsNumeric(row_value)

теперь есть выбор: использовать этот "честный код" или "солдатскую хитрость" с SETF или лайт-коддинг в окне Immediate.
Пока не вышло допилить код, с добавлением строк user.defined cells в целевой шейп если они в нем отсутствуют Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 29 июл 2015, 20:06 
Не в сети
Бывалый

Зарегистрирован: 19 июн 2015, 22:18
Сообщений: 101
Использую Visio c: 2013
Очков репутации: 21

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
теперь есть выбор: использовать этот "честный код", "солдатскую хитрость" с SETF или лайт-коддинг в окне Immediate.


По моему "честный код" лучше. Хотя если вдруг в ячейке появится число - например 42213.62392361, то VBA примет его за дату. Но эта вероятность ничтожна (а в моем случае исключена).
"солдатскую хитрость" с SETF можно использовать, но у нее есть один недостаток - производительность. Я думаю она должна работать гораздо медленнее.
А вот с Immediate, как я понял, это просто способ подстановки.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: как определить тип данных в User-defined cell
СообщениеДобавлено: 29 июл 2015, 21:00 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
добавил проверку содержит ли формула в ячейке подстроку NOW или DATETIME. теперь отрабатывает и нецелые числа
Код:
Sub vin_edited()
Dim sh As Shape
Set sh = ActiveWindow.Selection(1)
Dim nsh As Shape
Set nsh = ActivePage.Shapes.ItemFromID(2)
For i = sh.Section(242).Count - 1 To 0 Step -1
    bl = False
    ROW_NAME = sh.CellsSRC(visSectionUser, i, visUserValue).RowNameU
    row_value = sh.CellsSRC(visSectionUser, i, visUserValue).ResultStr("")
    row_formula = sh.CellsSRC(visSectionUser, i, visUserValue).FormulaU
    If InStr(row_formula, "DATETIME") > 0 Or InStr(row_formula, "NOW") > 0 Then   ' если в ячейке дата
    VL = sh.CellsSRC(visSectionUser, i, visUserValue)
    VL = "DATETIME(" & VL & ")"
    nsh.Cells("USER." & ROW_NAME).FormulaU = VL
    Else
    If IsNumeric(row_value) Then  ' если в ячейке число
    VL = Replace(sh.CellsSRC(visSectionUser, i, visUserValue).ResultIU, ",", ".")
    nsh.Cells("USER." & ROW_NAME).FormulaU = VL
    Else  ' если в ячейке строка
    VL = sh.CellsSRC(visSectionUser, i, visUserValue).ResultStr("")
    nsh.Cells("USER." & ROW_NAME).FormulaU = Chr(34) & VL & Chr(34)
    End If
    End If
Next
End Sub
vin писал(а):
А вот с Immediate, как я понял, это просто способ подстановки.
да, там подставляется формула, а не значение! не твой вариант, тут я погорячился…


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB