Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13325 / 13646 ツリー ←次へ | 前へ→

【5932】縦計、横計の判別 つん 03/6/10(火) 11:24 質問
【5933】Re:縦計、横計の判別 Jaka 03/6/10(火) 12:28 回答
【5934】連続している場合はOK!でも・・・ つん 03/6/10(火) 13:30 質問
【5936】Re:連続している場合はOK!でも・・・ Jaka 03/6/10(火) 14:25 回答
【5937】Re:連続している場合はOK!でも・・・ ぴかる 03/6/10(火) 14:29 回答
【5938】Jakaさん、ぴかるさん、ありがとうござい... つん 03/6/10(火) 14:47 発言
【5942】つんさんごめんなさい。 Jaka 03/6/10(火) 15:54 発言
【5945】とんでもござりません。 つん 03/6/10(火) 16:23 お礼
【5939】Re:縦計、横計の判別 JuJu 03/6/10(火) 15:04 回答
【5941】Re:縦計、横計の判別 ポンタ 03/6/10(火) 15:32 回答
【5944】JuJuさん、ポンタさん、ありがとうござい... つん 03/6/10(火) 16:12 お礼
【5964】Re:JuJuさん、ポンタさん、ありがとうござい... JuJu 03/6/11(水) 12:16 発言
【5980】Re:JuJuさん、ポンタさん、ありがとうござい... つん 03/6/11(水) 12:57 お礼
【5943】リトライです。 ぴかる 03/6/10(火) 15:58 回答
【5947】OKです! つん 03/6/10(火) 16:38 お礼

【5932】縦計、横計の判別
質問  つん E-MAIL  - 03/6/10(火) 11:24 -

引用なし
パスワード
   こんにちは。
いつもお世話になります。

早速ですが、質問させて頂きます。
セルにSUM関数で数式が入力されているとして、
それが、縦計であるか?横計であるか?を判別したいのですが、
よい方法はないでしょうか?

縦計、というのは、例えばA列なら、
「=SUM(A1:A6)」とか「=SUM(A11,A7)」とか「=SUM(A13:A14,A12,A7)」
のように、他の列にまたがらないで、A列の数値のみの計で、

横計は、1行目なら、1行目のみで他の行にはまたがらない、
1行目の数値のみの計ということです。

なにか良い案がありましたら、アドバイスお願いします。

【5933】Re:縦計、横計の判別
回答  Jaka  - 03/6/10(火) 12:28 -

引用なし
パスワード
   こんにちは。
無い知恵絞ってみました。
やっぱダメ??

Sub mmm()
  aa = Application.Substitute(Range("A1").Formula, "=SUM(", "")
  aa = Left(aa, Len(aa) - 1)
  If Range(aa).Columns.Count > 1 Then
    MsgBox "横"
  ElseIf Range(aa).Rows.Count > 1 Then
    MsgBox "縦"
  Else
    MsgBox "良くわかんない。"
  End If
End Sub

【5934】連続している場合はOK!でも・・・
質問  つん E-MAIL  - 03/6/10(火) 13:30 -

引用なし
パスワード
   Jaka さん、こんにちは(^o^)ノ
レスありがとうございました。

早速試してみました。
OK!でした・・・ただし、セルが連続してるときは・・・

ちょっち手を加えました。

Sub mmm()

  Dim aa As String
  
  aa = Range("b4").Formula
  aa = Mid(aa, 6, Len(aa) - 6) ’このへんの変更は私の趣味というか・・・
  If (Range(aa).Columns.Count > 1) And (Range(aa).Rows.Count = 1) Then
    MsgBox "横"
  ElseIf (Range(aa).Rows.Count > 1) And (Range(aa).Columns.Count = 1) Then
    MsgBox "縦"
  Else
    MsgBox "良くわかんない。"
  End If

End Sub

これで、セルが連続している場合「=SUM(A1:A3)」とか「=SUM(A1:E1)」とか
「=SUM(A1:B3)」とかはOKでした。
でも、「=SUM(A8:A9,B4)」の形になるとダメみたいです。
最初の「A8:A9」だけ判断して、この場合「縦」になってしまいます。
この場合は、B列の数字も入ってくるから「良くわかんない」になって欲しいんだけど。

「,」で区切られた引数を一つ一つ調べていくしかないかなー?

【5936】Re:連続している場合はOK!でも・・・
回答  Jaka  - 03/6/10(火) 14:25 -

引用なし
パスワード
   う〜ん。わたくし、Formulaの使い方が良く解っていなかったみたいでした。
で、2かたまりのは絶対ダメってことで...。
1個増やしただけですみません。

  If Range(aa).Areas.Count > 1 Then
    MsgBox "良くわかんない。"
  ElseIf (Range(aa).Columns.Count > 1) And (Range(aa).Rows.Count = 1) Then
    MsgBox "横"
  ElseIf (Range(aa).Rows.Count > 1) And (Range(aa).Columns.Count = 1) Then
    MsgBox "縦"
  Else
    MsgBox "良くわかんない。"
  End If

【5937】Re:連続している場合はOK!でも・・・
回答  ぴかる  - 03/6/10(火) 14:29 -

引用なし
パスワード
   つんさん、Jakaさん、こんにちは。

いっぺんだけでも、つんさんのお役に立ちたいと思って考えてみました。
こんなんであきません?。

Sub TEST()

Dim 範囲 As String
 
  範囲 = Selection.Formula
  範囲 = Mid$(範囲, 6)
  範囲 = Mid$(範囲, 1, Len(範囲) - 1)
  
  If Range(範囲).Columns.Count > 1 Then
    MsgBox "横"
  ElseIf Range(範囲).Rows.Count > 1 Then
    MsgBox "縦"
  Else
    MsgBox "良くわかんない。"
  End If

End Sub

【5938】Jakaさん、ぴかるさん、ありがとうござい...
発言  つん E-MAIL  - 03/6/10(火) 14:47 -

引用なし
パスワード
   Jaka さん:

>う〜ん。わたくし、Formulaの使い方が良く解っていなかったみたいでした。
>で、2かたまりのは絶対ダメってことで...。
>1個増やしただけですみません。

ありがとうございます。でも、=SUM("a1,a3,a5") みたいな場合も対応させたいので・・・もう少し考えてみます。

ぴかる さん:

>いっぺんだけでも、つんさんのお役に立ちたいと思って考えてみました。
ありがとうございます(^o^)ノ

>こんなんであきません?。
うーん、やっぱりダメみたいです(>_<)

今、
  strSum = Range("A5").Formula
  strSum = Mid(strSum, 6, Len(strSum) - 6)  
  strArry = Split(strSum, ",") 
   
  For i = 0 To UBound(strArry)
    処理処理
  Next i

てな感じで、範囲毎に判断させて、と考えています。
でも、なーんか、むっちゃややこしくて、頭がパンクしかけてます。
もちっと頑張ってみますわ。
また、アドバイスよろしくお願いしますm(__)m

【5939】Re:縦計、横計の判別
回答  JuJu E-MAIL  - 03/6/10(火) 15:04 -

引用なし
パスワード
   つんさん、こんにちはぁ
Jakaさん、ぴかるさん、横からごめんしゃい。

あまり時間が取れないのでさわりだけ。

Precedentsプロパティというのがあります。
このプロパティは、セルが参照している参照元を返してくれるのでとても便利なプロパティです。

参照元が複数の範囲の場合、各範囲はAreasコレクションから取得する必要があります。
Areasコレクションをループで回しても良いんですけど、Intersect関数を使うと面白いかも^^;

実際に書くとこんな感じです。

With SUMのあるRange
  If Application.Intersect(.Precedents, .Precedents.Cells(1, 1).EntireRow).Count = .Precedents.Count Then
    MsgBox "たぶん横だけだと"
  End If
  If Application.Intersect(.Precedents, .Precedents.Cells(1, 1).EntireColumn).Count = .Precedents.Count Then
    MsgBox "たぶん縦だけかも"
  End If
End With

参照元がないときはエラーでとまるので、適当に変更してね。

ではではぁ

【5941】Re:縦計、横計の判別
回答  ポンタ  - 03/6/10(火) 15:32 -

引用なし
パスワード
   横から失礼します。

DirectPrecedents プロパティを使ってみました。
お試しください。

Sub test()
  MyCheck Range("A1")
End Sub

Sub MyCheck(Target As Range)
  On Error Resume Next
  Dim FirstCell As Range, r1 As Range, r2 As Range, c As Range
  For Each c In Target.DirectPrecedents
    If FirstCell Is Nothing Then
      Set FirstCell = c
    End If
    If r1 Is Nothing Then
      Set r1 = c.EntireRow
    ElseIf Intersect(r1, c) Is Nothing Then
      Set r1 = Union(r1, Range(FirstCell, c).EntireRow)
    End If
    If r2 Is Nothing Then
      Set r2 = c.EntireColumn
    ElseIf Intersect(r2, c) Is Nothing Then
      Set r2 = Union(r2, Range(FirstCell, c).EntireColumn)
    End If
  Next
  If FirstCell Is Nothing Then
    MsgBox ("参照無し")
  ElseIf r1.Rows.Count = 1 Then
    MsgBox ("横計")
  ElseIf r2.Columns.Count = 1 Then
    MsgBox ("縦計")
  Else
    MsgBox ("それ以外")
  End If
  On Error GoTo 0
End Sub

【5942】つんさんごめんなさい。
発言  Jaka  - 03/6/10(火) 15:54 -

引用なし
パスワード
   ごめんなさい。

JuJu師匠様から、なにやらすんばらしそうな手法が出ています。
それ手本にして見て下さい。
私は、フローチャートA41000枚作成に戻らせていただきます。
本当にやくにたてなくてごめんなさい。
つんさんあんましでてこなくて、しばらくぶりだったのに..。

【5943】リトライです。
回答  ぴかる  - 03/6/10(火) 15:58 -

引用なし
パスワード
   先程は、失礼しました。確認してなかったです。
センスないけど、作ってみました。今度はどうです?。

Sub TEST()

Dim 範囲 As String
Dim セル As Range
Dim 行 As Long
Dim 列 As Integer
Dim 行確認 As Boolean
Dim 列確認 As Boolean
  
  範囲 = Selection.Formula
  範囲 = Mid$(範囲, 6)
  範囲 = Mid$(範囲, 1, Len(範囲) - 1)
  
  For Each セル In Range(範囲)
    If (行 <> 0) And (行 <> セル.Row) Then
      行確認 = 1
    End If
    If (列 <> 0) And (列 <> セル.Column) Then
      列確認 = 1
    End If
    行 = セル.Row
    列 = セル.Column
  Next

  If (行確認 = True) And (列確認 = False) Then
    MsgBox "縦"
  ElseIf (行確認 = False) And (列確認 = True) Then
    MsgBox "横"
  Else
    MsgBox "良くわかんない。"
  End If
  
  
End Sub

【5944】JuJuさん、ポンタさん、ありがとうござい...
お礼  つん E-MAIL  - 03/6/10(火) 16:12 -

引用なし
パスワード
   JuJuさん、ポンタさん、回答ありがとうございました。
(タイトルじゃ、ありがとうござい...で切れてるやん(>_<))

Precedentsプロパティ、Precendentプロパティ、全然知りませんでした。
勉強になりました。

JuJuさんのコードを試してまして、ほぼOKでした。
しかし、Precedentsプロパティでは、参照元にさらに数式が入力されていて、その数式によって結果が違ってきていたので、悩んでいました。
ポンタさん回答の、DirectPrecedentsプロパティで、解決いたしました。

今回は、JuJuさんのコードを基本にやっていこうと思います。
ポンタさんのコードも試してみて、私の思うように動作いたしました。
また、解読して勉強させてもらいます。

ありがとうございました!

と、ここでちょっと気になってるのですが、
JuJuさん、
「MsgBox "たぶん横だけだと"」
と、「たぶん」という言葉が入ってますが、これはどうしてでしょう?
条件によって、正しい結果が得られない場合もあるということでしょうか?
色々試してみましたが、自分がチェックした限りでは、OKのような気がします。

【5945】とんでもござりません。
お礼  つん E-MAIL  - 03/6/10(火) 16:23 -

引用なし
パスワード
   Jaka さん、どもども

>JuJu師匠様から、なにやらすんばらしそうな手法が出ています。
>それ手本にして見て下さい。

はい。なにやら、むちゃ都合のよさそうなプロパティがあったようです。
さすが、JuJu師匠、頼りになります(^o^)
ポンタさんとの合わせ技で解決いたしました。

>私は、フローチャートA41000枚作成に戻らせていただきます。

ありゃ・・・なにやら忙しい時に助っ人に出てきて頂き、ありがとうございます。
頑張ってくださりませ。

>つんさんあんましでてこなくて、しばらくぶりだったのに..。

うん。最近、自律神経がなんか、自立してなくて・・・・さぼってました。
ぼちぼちがんばります。
また、よろしくね♪

【5947】OKです!
お礼  つん E-MAIL  - 03/6/10(火) 16:38 -

引用なし
パスワード
   ぴかる さん、どもども〜

>先程は、失礼しました。確認してなかったです。
>センスないけど、作ってみました。今度はどうです?。

OKでした!
そっかー、セル一つ一つ確認していけばいいんや。
私は、参照元のエリアごとで処理しようとしてたので、
ややこしくなってました(^^;

今回はJuJu師匠ので、やっていこうと思いますが、
ぴかるさんのコード、とても勉強になりました。
ありがとうございました(^o^)ノ

【5964】Re:JuJuさん、ポンタさん、ありがとうござ...
発言  JuJu E-MAIL  - 03/6/11(水) 12:16 -

引用なし
パスワード
   つんさん、こんにちはぁ

>しかし、Precedentsプロパティでは、参照元にさらに数式が入力されていて、その数式によって結果が違ってきていたので、悩んでいました。
>ポンタさん回答の、DirectPrecedentsプロパティで、解決いたしました。

参照元も参照してたのですね。そこまで気にしてなかったです^^;

>と、ここでちょっと気になってるのですが、
>「MsgBox "たぶん横だけだと"」
>と、「たぶん」という言葉が入ってますが、これはどうしてでしょう?
>条件によって、正しい結果が得られない場合もあるということでしょうか?

私が細かくチェックしてなかったので...ごめんなさい。

【5980】Re:JuJuさん、ポンタさん、ありがとうござ...
お礼  つん E-MAIL  - 03/6/11(水) 12:57 -

引用なし
パスワード
   JuJu さん、こんにちは

>私が細かくチェックしてなかったので...ごめんなさい。
わかりました。
一応、考えられる範囲で色々チェックしてみて問題なかったようです。
ありがとうございました。

13325 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free