Excel VBA質問箱 IV

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

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


736 / 13645 ツリー ←次へ | 前へ→

【78637】どうかよろしくお願いします エクセルの素人 16/12/2(金) 23:52 質問[未読]
【78639】Re:どうかよろしくお願いします β 16/12/3(土) 9:31 発言[未読]
【78640】Re:どうかよろしくお願いします 夜露四九 16/12/3(土) 9:43 発言[未読]
【78641】Re:どうかよろしくお願いします β 16/12/3(土) 11:00 発言[未読]
【78642】Re:どうかよろしくお願いします エクセルの素人 16/12/3(土) 13:21 発言[未読]
【78644】Re:どうかよろしくお願いします β 16/12/3(土) 17:10 発言[未読]
【78648】Re:どうかよろしくお願いします エクセルの素人 16/12/4(日) 12:28 お礼[未読]
【78643】Re:どうかよろしくお願いします γ 16/12/3(土) 14:52 発言[未読]
【78646】Re:特定の数値パターンを調べるには? γ 16/12/4(日) 11:32 発言[未読]
【78647】Re:特定の数値パターンを調べるには? エクセルの素人 16/12/4(日) 12:25 お礼[未読]
【78649】Re:特定の数値パターンを調べるには? γ 16/12/4(日) 13:06 発言[未読]

【78637】どうかよろしくお願いします
質問  エクセルの素人  - 16/12/2(金) 23:52 -

引用なし
パスワード
   先ほど、質問させていただいたのですが
レスがつかないと思い、出来るだけ達人の先生方に
伝わるように書き直し、再投稿いたします。

ある行に数字1,0,9・・・とランダムに
数字が並んでいるとします。(9は欠損値とします)
その行はずっと下まで続いているものとします。
ある行の右側に1がくるとします。そのとき、1に一番近い左側に
0がくればY列に1をおきたいのです。そして、その行に結果的に
右側の1の左側に0が来ない場合、Y列に0をおくものとします。

そして、右側の1に一番近い左側にOが来た場合はさらに、Z列に、ABCDE・・・
のどの列の0がきたのかをZ列に記したいとおもいます。
(例)のようにY列に1か0、Z列にABCD・・・のどれかを
おいてほしいのです。
これらを満たす関数をおしえていただけないでしょうか?
なお、行、列ともに数字が続くものとして、一番最後の2列に
に1か0、ABC・・・のどれかがわかるような
汎用性の高い関数を作りたいと思いますが
なかなかできません。
どうかお助けください。

    A  B  C  D  E ・・・・ Y   Z
1   0  9  1  0  0      1   A  ← (例)
2   0  0  1  0  0      1   B  ← (例)
3   0  1  1  9  0     1かO 
4   0  9  1  0  0     1かO
5   0  1  1  0  0     1かO
6   1  0  9  1  0     1かO




【78639】Re:どうかよろしくお願いします
発言  β  - 16/12/3(土) 9:31 -

引用なし
パスワード
   前トピでγさんから指摘がありますが、ここは『VBA』の質問掲示板です。
回答は VBAベースでいいのですね??

それと、1 ないしは 0 と その右側に AやBやC をいれる、その場所は

>Y列とZ列 

なんですか? それとも

>一番最後の2列

なんですか?

【78640】Re:どうかよろしくお願いします
発言  夜露四九  - 16/12/3(土) 9:43 -

引用なし
パスワード
   VBA質問箱基本ポリシー
ht tp://www.vbalab.net/bbspolicy.html

>質問者の方へのお願い

>タイトルは内容を示すものに
>記事のタイトルは、その質問の内容が端的にわかるようなものにしてください。
>単に「教えてください」とか「困っています」などといったタイトルでは、回答者があなたの質問をクリックしない可能性が非常に高くなります。すなわち、回答がつかない可能性
>が高くなる、ということです。

【78641】Re:どうかよろしくお願いします
発言  β  - 16/12/3(土) 11:00 -

引用なし
パスワード
   ▼エクセルの素人 さん:

以下も、いまいち不明ですので明確にしてもらわなければいけません。

・0 や 1 や 9 が入っている(可能性のある)領域は A〜X までなのか。
 それとも、それ以上になることもあるのか。
・その領域、Aから順番に数字が切れ目なく記入されているのか、間に空白はあるのか。
・登場する数字は 0 と 1 と 9 のみなのか、他の数字も登場するのか。
・判定すべき 1 の位置は?
 前トピでは、その行で最初に現れる 1 という説明。
 今回は、その行の右にあらわれる 1 という説明。(その行で一番最後の 1 ?)
・その左側の数字の判定というのは、本当に1つ左のセルなのか、左方面にみていって (9 を無視して)
 最初の 1 ないしは 0 なのか。
・左側に 1 も 0 もなかったらどうするのか。

これを明確にしてもらえれば、もしかしたら関数もかけるかもしれません。

【78642】Re:どうかよろしくお願いします
発言  エクセルの素人  - 16/12/3(土) 13:21 -

引用なし
パスワード
   βさん、
返信ありがとうございます。
>0 や 1 や 9 が入っている(可能性のある)領域は A〜X までなのか。
 それとも、それ以上になることもあるのか。
それ以上になることもあります。

>その領域、Aから順番に数字が切れ目なく記入されているのか、間に空白はあるのか。
空白があれば、その部分にダミーの数字として9をいれます。
0000999991 という順番があります。

>登場する数字は 0 と 1 と 9 のみなのか、他の数字も登場するのか。
3つの数字のみです。

>判定すべき 1 の位置は?
>前トピでは、その行で最初に現れる 1 という説明。
>今回は、その行の右にあらわれる 1 という説明。(その行で一番最後の 1 ?)
常に左側から右に見ていくという感じになります。
009199900001 と数字がなっていた場合、最初の091を0と1のコンビとして採用していく感じです。

>その左側の数字の判定というのは、本当に1つ左のセルなのか、左方面にみてい>って (9 を無視して)
> 最初の 1 ないしは 0 なのか。
左側から右にみていって、最初に現れた0があったとしたときに、次に現れたのが9とした場合、もしくは9や0が続いた場合、1が出たとしたらコンビ成立として考えたいのです。

> 最初の 1 ないしは 0 なのか。
実は、01、09991などあったとしても、01の順番であったらそれが探している0と1と考えています。実は、今回0が出た時をさがす関数がほしいのですが、実は、1が出たときの関数も例えばどこかの列に表したいと思っています。

なお、1行目は任意のA1 B1 C1 や 1111 2222 3333・・・として考えており、2行目からもしくは3行目から019の数字の行が下の列にずっと続いていく式をほしいと思っております。

恐縮ですが、どうかよろしくお願いいたします。

【78643】Re:どうかよろしくお願いします
発言  γ  - 16/12/3(土) 14:52 -

引用なし
パスワード
   βさんのお陰で、大分明確になりました。
ありがとうございました。

関数でということなので、そちらは皆様にお願いすることとして、
番外で、VBAで遊んで見ました。
こんなことなんでしょうか。

【インデックスがずれていたので再掲します】
 
Sub Sample()
  Dim re As Object
  Dim m  As Object
  Dim r  As Range
  Dim s  As String
  Dim i  As Long
  
  '正規表現を利用する準備
  Set re = CreateObject("VBScript.RegExp")
  re.Pattern = "09*1"   ' 0に1が続く場合。(間に9があっても可)
   
  Set r = Intersect([A1].CurrentRegion, Columns("A:X"))
  r.Interior.Pattern = xlNone     ' 塗りつぶしを解除
  
  For i = 2 To r.Rows.Count
    s = Join(Application.Index(r.Rows.Item(i).Value, 0), "")
    Set m = re.Execute(s)
    If m.Count > 0 Then       ' マッチした場合
      Cells(i, "Y").Value = 1
      Cells(i, "Z").Value = Cells(1, m(0).firstindex + 1).Value
      Cells(i, "AA").Value = Cells(1, m(0).firstindex + m(0).Length).Value
      With Cells(i, m(0).firstindex + 1).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535     '黄色に塗りつぶす
      End With
    Else              'マッチしなかった場合
      Cells(i, "Y").Value = 0
      Cells(i, "Z").ClearContents
      Cells(i, "AA").ClearContents
    End If
  Next
End Sub

【78644】Re:どうかよろしくお願いします
発言  β  - 16/12/3(土) 17:10 -

引用なし
パスワード
   ▼エクセルの素人 さん:

説明をもらったのですが理解力がプアで、なんとなくわかりにくいなぁと
そう思っていたんですが、γさんに整理いただいたコードを拝見して、
あぁ、こういうことだったのか うん、うん そうだよね ということで
理解できました。

ところで、

> や 1 や 9 が入っている(可能性のある)領域は A〜X までなのか

に対して

>それ以上になることもあります。

これは困りましたねぇ。
もちろん VBAなら、最大列を自動取得して処理することはできますが
γさんのコードでは、エクセルの素人さん(このHN あまりよろしくないですね)が
理解しやすいように 有無結果を Y列に、あった場合の、0 の項目名を Z列に
また、1 の項目名を AA列の記載しておられますので、もし、数字が Y列以降にもあるということになると
問題ですね。(ちなみに、1行目がタイトル行で2行目から下が 数字の入ったデータ行という前提)

で、VBAならなんとでもなりますが、関数となると、どこかのセルに式を入力する必要が
ありますね。腕を組んで、じっと画面をにらんでいても誰も入力してくれませんから。
誰が入力するかというと、エクセルの素人さんですね。
どの列のセルに式をいれますか??

まぁ、仮に 数字が AX列まであった場合は、その右の AY列以降に式をいれるとします。
この場合、A列〜AX列までの領域内で判定をしなければいけません。

このあたりまでは、なんとか、関数素人のβでも式を組み立てていたんですが
【0 と 1 のペア】という考え方があると、もう、とっても手に負えません。

偉そうに、もしかしたら関数もかけるかもしれません と申し上げましたが撤回します。

【78646】Re:特定の数値パターンを調べるには?
発言  γ  - 16/12/4(日) 11:32 -

引用なし
パスワード
   βさんからのご指摘を踏まえて、改定版を載せておきます。

・対象となる範囲は自由。
 ・A1から始まらなくてもよいし、行列の大きさを問わない。
 ・ただし、周囲を空白ないし行列境界で囲まれたひとつながりの領域であること。
 ・その領域の一部にカーソルをおいた状態で、マクロを実行させます。

・結果の書込範囲は指定不要。
 その領域の右の空白一列は空けて、その次の列から自動で書き込みます。

・開始の0セルを黄色で塗りつぶし、終了の1セルを緑で塗りつぶします。(可視性)

------------------
Sub Sample2()
  Dim re    As Object
  Dim m    As Object
  Dim myTable As Range
  Dim myHeader As Range
  Dim s    As String
  Dim i    As Long
  Dim lastCol As Long
  Dim pos0   As Long
  Dim pos1   As Long
  
  If TypeName(Selection) <> "Range" Or IsEmpty(Selection(1)) Then
    MsgBox "対象となる範囲の一部にカーソルを置いて下さい"
    Exit Sub
  End If
  
  Application.ScreenUpdating = False
  
  '正規表現を利用する準備
  Set re = CreateObject("VBScript.RegExp")
  'マッチパターンの指定
  re.Pattern = "09*1"  '0に1が続く場合。(間に任意個の9があっても可)

  Set myTable = Selection.CurrentRegion
  Set myHeader = myTable.Rows(1).Cells
  
  lastCol = myTable.Columns.Count
  myTable.Interior.Pattern = xlNone  ' 塗りつぶしをいったん解除

  For i = 2 To myTable.Rows.Count
    s = Join(Application.Index(myTable.Rows.Item(i).Value, 0), "") '連結文字列に
    Set m = re.Execute(s)  '正規表現によるマッチの実行
    If m.Count > 0 Then   ' マッチした場合
      pos0 = m(0).firstindex + 1       '0 の位置
      pos1 = m(0).firstindex + m(0).Length  '1 の位置
      myTable(i, lastCol + 2).Value = 1
      myTable(i, lastCol + 3).Value = myHeader(1, pos0).Value
      myTable(i, lastCol + 4).Value = myHeader(1, pos1).Value
      myTable(i, pos0).Interior.Color = vbYellow '黄色に塗りつぶす
      myTable(i, pos1).Interior.Color = vbGreen '緑色に塗りつぶす
    Else  'マッチしなかった場合
      myTable(i, lastCol + 2).Value = 0
      myTable(i, lastCol + 3).ClearContents
      myTable(i, lastCol + 4).ClearContents
    End If
  Next
  Application.ScreenUpdating = True
End Sub

【78647】Re:特定の数値パターンを調べるには?
お礼  エクセルの素人  - 16/12/4(日) 12:25 -

引用なし
パスワード
   γさん

お世話になっております。

いろいろご検討いただきありがとうございます。
このようなVBAマスターの方がいる中で
VBAではなく、関数を教えていただきたいという
無理を言ってしまっており、申し訳なく思っております。

私自身、ここで回答していただきました
VBAを試させていただきました。
関数ではなかなかうまくいかなかったこともうまくいくように
感じました。
ただし、私自身も本を読みながらVBAに触れているのですが、
私の周囲の人にその方法を伝えることが今の私には難しく、
やはり関数のほうがよいという考えに至りました。

いったん、ここで投稿元の私としては、終息させていただこうと思います。

いろいろありがとうございました。

【78648】Re:どうかよろしくお願いします
お礼  エクセルの素人  - 16/12/4(日) 12:28 -

引用なし
パスワード
   βさん

お世話になっております。

関数に関していろいろ考えていただき
本当にありがとうございました。
私もここで教えていただいたVBAを触りましたが、
私の周囲の人にその方法を伝えることが今の私には難しく、
やはり関数のほうがよいという考えに至りました。

いったん、ここで投稿元の私としては、終息させていただこうと思います。

いろいろありがとうございました。

【78649】Re:特定の数値パターンを調べるには?
発言  γ  - 16/12/4(日) 13:06 -

引用なし
パスワード
   わざわざご丁寧に、ありがとうございます。

関数というんですか?それを使えば、
誰でも簡単に理解できるものでもないし、
あなた以外の使い手も、内容を全て理解する必要もないと思う。
それに越したことはないが、マストでもない。

色々なケースで関数に手を入れるのも大変です。
マクロであれば、1回、ボタンに登録するだけ。
あとは、ボタンを押すだけ。

しかし、その選択は各人の勝手ですから、
どうぞご自由に。
それでは、さようなら。

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