Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual Basic
Перезагрузить страницу что здесь:формула, формула массива, или значение?
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Алек_Л Алек_Л вне форума
Member
 
Сообщений: 114
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.07.2006
По умолчанию 22.01.2007, 11:25

Добрый день.

Можно ли понять, заведена в ячейке формула, формула массива, или значение? С формулой и значением еще как-то можно придумать:
Код:
SpecialCells(xlCellTypeConstants или xlCellTypeFormulas, 23)
, но как определить, что именно за формула в ячейке: FormulaR1C1 или FormulaArray?

P.S. У меня в столбце есть все 3 типа этих данных, и в зависимости от того, что это за данные, мне нужно: для значений - не делать ничего, для формул - распространить (скопировать) по столбцам, для формул массива - тоже распространить по столбцам. Не хочется делать это через копировать- вставить. Как сделать в моем случае через присвоение формулы диапазону?

Спасибо.
Ответить с цитированием
  (#2 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 22.01.2007, 11:59

Любая формула возвращает значение, и даже #ДЕЛ/0! это тоже значение, но ошибки. Поэтому, если Вы хотите определить, что содержит ячейка : константу или формулу, в т.ч. и формулу массива, то :

Код:
With ThisWorkbook.Worksheets(1).Range("A1")
     If Not IsEmpty(.Value) Then
        If .HasFormula = True Then
           MsgBox "Формула " & IIf(.HasArray = True, "массива", ""), , ""
        Else
           MsgBox "Константа", , ""
        End If
     Else
        MsgBox "Пусто", , ""
     End If
End With
Ответить с цитированием
  (#3 (permalink)) Старый
diment diment вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2006
По умолчанию 22.01.2007, 12:06

If Cells( ).HasArray Then - для формул массива
range( ).FormulaArray = " =....."


If Cells( ).HasFormula Then - для простых формул

добавлено позже
pashulka вы меня операдили с ответом, это я к тому что бы не было мыслей в банальных повторах
Ответить с цитированием
  (#4 (permalink)) Старый
Алек_Л Алек_Л вне форума
Member
 
Сообщений: 114
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.07.2006
По умолчанию 22.01.2007, 12:07

Спасибо.
Ответить с цитированием
  (#5 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 22.01.2007, 12:54

Ну, если несколько строк и впрямь можно писать как минимум семь минут, то наверное никакого повтора и не было, а если серьёзно, то без проверки IsEmpty (или т.п.) подобный подход никуда не годится, ибо предполагается, что если ячейка не содержит формулу, то там константа. Совершенно очевидно, что это не так и ячейка может быть пустой. Да, и свойство HasFormula возвращает True - если в ячейке наличествует любая формула, а это может быть и ссылка, и именованная формула, и формула массива.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
diment diment вне форума
Member
 
Сообщений: 227
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2006
По умолчанию 22.01.2007, 13:02

Pashulka ни с чем не спорю, твои аргументы как всегда весомы. я просто не рассматриваю проблему так всесторонне, и мне пришлось отвлечься от компа уже после того как я открыл тему (даже если это выглядит как оправдание)
Ответить с цитированием
  (#7 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 22.01.2007, 13:57

Diment, Вы правы: внимательно читать вопрос - это хорошо и правильно, а в самом вопросе ничто не указывало на то, что ячейка может быть пустой, более того, автор акцентировал внимание только на формулах и константах. Но и предусмотреть такую возможность - это тоже неплохо, тем более, что автор мог и не обратить внимание на такую "мелочь" как пустые ячейки (хотя, Алек_Л наверное просто не хотел грузить читателей лишними подробностями)

Кстати, если для разделения формул, в инструкции If Then ... сначала использовать .HasArray, то имеет смысл воспользоваться :

Код:
If Лист1.Range("A1").HasArray = True Then
   MsgBox "Формула массива", , ""
ElseIf Лист1.Range("A1").HasFormula = True Then
   MsgBox "Формула", , ""
End If
Или помучить инструкцию Select Case

Код:
Select Case True
    Case IsEmpty(Лист1.Cells(1)): MsgBox "Пусто", , ""
    Case Лист1.Cells(1).HasArray: MsgBox "Формула массива", , ""
    Case Лист1.Cells(1).HasFormula: MsgBox "Формула", , ""
    Case Else: MsgBox "Константа", , ""
End Select
Примечание : Лист1 - это кодовое/программное имя рабочего листа.
Ответить с цитированием
  (#8 (permalink)) Старый
Алек_Л Алек_Л вне форума
Member
 
Сообщений: 114
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.07.2006
По умолчанию 23.01.2007, 17:16

Добрый день.

Пробую по варианту с select case.
При выборе case "формула", вставляю в диапазон ячеек (справа от текущей), такую же формулу, как и в ней
Код:
Range(Range(varB.Address).Offset(0, 1), Range(varB.Address).Offset(0, CLast - 11)).FormulaR1C1 = .Formula
,но получается ерунда: вместо вставки формулы, вставляется формула в апострофах, например ='J12'
А при выборе case "массив" так и вообще получается debug.

Подскажите, что не так?
Ответить с цитированием
  (#9 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 23.01.2007, 18:14

Формулы бывают разные и если заполнить диапазон ссылкой, типа =J2 то изменится адресация(), но в любом случае: скрещивать ежа с ужом не надо (FormulaR1C1=Formula). Что касается формул массива, то они могут возвращать массив значений, и здесь надо говорить более предметно.

Код:
Dim varB As Range
Set varB = Лист1.Cells(1)

Select Case True
    Case varB.HasArray
    varB.Offset(, 1).Resize(, 5).FormulaArray = varB.Formula
    Case varB.HasFormula
    varB.Offset(, 1).Resize(, 5).Formula = varB.Formula
End Select
Ответить с цитированием
  (#10 (permalink)) Старый
Алек_Л Алек_Л вне форума
Member
 
Сообщений: 114
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.07.2006
По умолчанию 23.01.2007, 19:01

Спасибо.

А у меня переменная была - variant, а не range. Видимо, это принципиально?
С формулой теперь получилось.
А вот с массивом - не очень. Скажем, заведена в ячейку формула массива
Код:
{=SUM(IF(" & Diapazon2 & "=""ИСТИНА"",IF(" & Diapazon3 & "={""90.3"",""90.6"",""91.1"",""91.2"",""91.3"",""66.1"",""66.4""}," & DiapazonC & ")))}
где Diapazon2 и 3 абсолютные ссылки, а вто DiapazonC - смешанная, DiapazonC = "R[1]C:R" & RLast & "C". Так вот, смешанная ссылка DiapazonC по всем столбцам вставилась без изменений как J9:J$474 !

Можете что-то посоветовать?
Ответить с цитированием
  (#11 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 23.01.2007, 20:35

1. Скажем так, переменная может иметь тип Range, Object, Variant
2.
Код:
Range("A1").Formula = "=SUM(IF($B$1:$B$5=TRUE,IF(C1:C5=FALSE,D1:D5)))" 'для примера

Range("H1").FormulaArray = Range("A1").Formula
Range("H1:J1").FillRight
Ответить с цитированием
  (#12 (permalink)) Старый
Алек_Л Алек_Л вне форума
Member
 
Сообщений: 114
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.07.2006
По умолчанию 24.01.2007, 11:52

Огромное спасибо!
Попробую.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Алек_Л Алек_Л вне форума
Member
 
Сообщений: 114
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.07.2006
По умолчанию 12.02.2007, 17:49

Опять загвоздка.
А что делать, если формулу массива со смешанными ссылками нужно скопировать не вправо, а перенести на 2 столбика влево?
С переносом формулы все получилось:
Код:
varB.Offset(0, -2).Formula = varB.FormulaR1C1
а вот с массивом опять беда. Помогите, пожалуйста!
Ответить с цитированием
  (#14 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 12.02.2007, 20:33

Алек_Л, Вы можете опубликовать (или отправить мне лично) текст нужной формулы массива и текст этой формулы после 'смещения'
Ответить с цитированием
  (#15 (permalink)) Старый
Алек_Л Алек_Л вне форума
Member
 
Сообщений: 114
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.07.2006
По умолчанию 13.02.2007, 10:12

Формулы разные в разных строках, по типу такой:
Код:
до смещения{=СУММ(ЕСЛИ($B9:$B$222="да";ЕСЛИ($C9:$C$222={"6.1";"6.2";"6.3"};Q9:Q$222)))},
после смещения {=СУММ(ЕСЛИ($B9:$B$222="да";ЕСЛИ($C9:$C$222={"6.1";"6.2";"6.3"};H9:H$222)))}
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формула изменения яркости Anonymous Программирование графики 7 02.04.2016 12:46
Формула-1 fatei4eff Спорт 15 15.01.2012 19:43
определить, является ли формула тавтологией Chuchka Prolog 2 25.11.2010 17:55
Формула-1 Veselotix Спорт 12 01.11.2008 10:43
Формула в Exel? mp3 Visual Basic 5 25.07.2007 07:35
Формула Lisenok Prolog 6 20.02.2007 23:54
формула Sergeant Visual Basic 4 07.07.2006 22:32
Не работает формула dorogo Visual Basic 9 04.05.2006 17:29
Какая существует формула для Delphi Anonymous Вопросы начинающих программистов 29 15.10.2004 13:25
Формула удовольствия Garik Юмор 0 28.01.2004 15:17
Простейшая формула 2D движка Anonymous Алгоритмы 1 04.03.2003 20:42



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов