アプリ版:「スタンプのみでお礼する」機能のリリースについて

E列に入力する関数でも、マクロでも良いので、E列にフラグを立てるようにしたいです。

複雑でうまく説明出来ていないかも知れませんが、どうぞよろしくお願いいたします。


1. C列が「C'」から始まるものがあれば、その行のセルAを見る。
2. A列に同じ数字がないか探す。あった場合、その行のセルCが何の文字から始まるかを見る。
3. そのセルCが、"A","B","D","E","F"で始まる場合、1.で最初に見たC'から始まるセルCと
  同じ行のセルEに、セルCの値を入れる。



【実行前】

A列    B列    C列      D列    E列
222    AAAA   C'あああ   ABC
222    HHHH   Bととと    QWN
333    GGGG   ウウウ    DGG
111    BBBB   C'ううう    FUI
444    CCCC   C'えええ   KOL
444    KKKK   C'おおお   MYT
444    LLLL   C'おおお   REF
999    DDDD   イイイ     VGC
777    EEEE   C'ききき    XSH
777    UUUU   Fかかか   ZOL

【完成イメージ】

A列    B列    C列      D列    E列
222    AAAA   C'あああ   ABC   C'あああ
222    HHHH   Bととと    QWN
333    GGGG   ウウウ    DGG
111    BBBB   C'ううう    FUI
444    CCCC   C'えええ   KOL
444    KKKK   C'おおお   MYT
444    LLLL   C'おおお   REF
999    DDDD   イイイ     VGC
777    EEEE   C'ききき    XSH   C'ききき
777    UUUU   Fかかか   ZOL

A 回答 (6件)

merlionXXです。


補足をみました。

> どの部分を修正したらよろしいでしょうか?

こういうことかな?

Sub test02()
  Dim myV
  Dim myStr As String, i As Long, n As Long
  myV = Range("A1:E1", Range("A1:E1").End(xlDown)).Value
  myStr = "ABDEF"
  For i = 1 To UBound(myV)
    If Left(myV(i, 3), 2) = "C'" Then
      For n = 1 To UBound(myV)
        If myV(i, 1) = myV(n, 1) Then
          If InStr(myStr, Left(myV(n, 3), 1)) > 0 Then
            myV(i, 5) = myV(i, 3)
            myV(n, 5) = myV(n, 3)
          End If
        End If
      Next n
    End If
  Next i
  Range("A1").Resize(UBound(myV), UBound(myV, 2)).Value = myV
End Sub
    • good
    • 0
この回答へのお礼

出来ました!!
本当に助かりました。補足の質問にも答えていただき、感謝しております。
merlionXXさん、この度は本当にありがとうございました。

お礼日時:2011/01/28 07:43

参考。



事例では、A列がある程度固まって並んでいます。
実際はどうでしょう?。

222    AAAA   C'あああ   ABC   C'あああ
333    GGGG   ウウウ    DGG
111    BBBB   C'ううう    FUI
222    HHHH   Bととと    QWN

念のため、上記みたいな並びはありますか?。



>For i = 1 To UBound(myV)
C列が「C'」から始まるものがあれば・・・の検索

>For n = 1 To UBound(myV)
A列に同じ数字がないか探す、の検索

例えば、1000行あれば、
1行目のC列に見つかれば1~1000まで探す、
3行目のC列に見つかればまた1~1000まで探す、
みたいなことになってます。

A列の単位で並べられていて、同じものが離れていないのであれば、
A列の値が変われば探す必要なし、となるので
処理は今より早くなります。

111
222
222
333
444
444
444
777
777
999
みたいに。

>InStr(myStr, Left(myV(n, 3), 1)) > 0
文字が存在するかチェックです。
あればその位置を返しますから、>0は存在したことを意味する。
「"A","B","D","E","F"で始まる場合」に使ってます。

自己解決できないのであれば、
長い関数やコードを提示してもらった場合は、説明ももらうようにしないと
また悩むことになりかねないです。
    • good
    • 0
この回答へのお礼

分かりやすく解説して頂いてありがとうございました。
自己解決できるように少しずつ勉強していきたいです。

お礼日時:2011/01/28 07:44

C列の判定


A列の判定
でもって
E列に何かセットしなければならないだろう、というのは絞られて来ます。3分の1以下くらいでは?。
それでも関数やマクロでしょうか?。

A列にあるか探す、無駄が起きる操作です。
大量だから関数やマクロかもしれませんが、作業情報列作るとかした方がわかりやすいです。

関数、判定が合っているか?、はわかるようにしておくこと。見てなにやっているか後々わかりにくい。


並べ替えるとかは考えないですか。333や999は関係ないとわかってますから工夫できないか?。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
merlionXXさんに作って頂いたマクロで、無事処理が出来ました。

お礼日時:2011/01/25 19:25

関数では思いつきませんのでマクロにしました。


標準モジュールに書いてください。

表はA1からあるものとします。
一例です。

Sub test01()
  Dim myV
  Dim myStr As String, i As Long, n As Long
  myV = Range("A1:E1", Range("A1:E1").End(xlDown)).Value
  myStr = "ABDEF"
  For i = 1 To UBound(myV)
    If Left(myV(i, 3), 2) = "C'" Then
      For n = 1 To UBound(myV)
        If myV(i, 1) = myV(n, 1) Then
          If InStr(myStr, Left(myV(n, 3), 1)) > 0 Then
            myV(i, 5) = myV(i, 3)
          End If
        End If
      Next n
    End If
  Next i
  Range("A1").Resize(UBound(myV), UBound(myV, 2)).Value = myV
End Sub

この回答への補足

回答ありがとうございます。

merlionXXさんに作って頂いたマクロで、無事処理が出来ました!!
本当に助かりました。ありがとうございました。


すみません、追加で教えて頂けるとありがたいのですが、


3. そのセルCが、"A","B","D","E","F"で始まる場合、1.で最初に
  見たC'から始まるセルCと同じ行のセルEに、セルCの値を入れる。


という部分を


3. そのセルCが、"A","B","D","E","F"で始まる場合、E列に
  セルCと同じ値を入力する。

(C'から始まる行だけでなく、"A","B","D","E","F"で始まる行にも
セルCと同じ値を入れたいです。)


というように修正する場合、merlionXXさんに作って頂いたマクロの
どの部分を修正したらよろしいでしょうか?


お手数をおかけしますが、よろしくお願いいたします。



新 【完成イメージ】

A列    B列    C列      D列    E列
222    AAAA   C'あああ   ABC   C'あああ
222    HHHH   Bととと    QWN   Bととと
333    GGGG   ウウウ    DGG
111    BBBB   C'ううう    FUI
444    CCCC   C'えええ   KOL
444    KKKK   C'おおお   MYT
444    LLLL   C'おおお   REF
999    DDDD   イイイ     VGC
777    EEEE   C'ききき    XSH   C'ききき
777    UUUU   Fかかか   ZOL   Fかかか

補足日時:2011/01/25 19:23
    • good
    • 0

セル式で作るのは無理だと思います。

途中でループが入るし。





1. C列が「C'」から始まるものがあれば、その行のセルAを見る。

単純なIF判定。一致しなければ、2、3は飛ばす。
ただし、ここで必要な情報は全て持つ必要あり。(2、3に影響)

2. A列に同じ数字がないか探す。あった場合、その行のセルCが何の文字から始まるかを見る。

最初から、もしくは特定位置からループで総ナメしてチェック。

3. そのセルCが、"A","B","D","E","F"で始まる場合、1.で最初に見たC'から始まるセルCと
  同じ行のセルEに、セルCの値を入れる。

2のループ内でIF判定。1で取得した値等を使用

あと、1~3までを全行分、回すループで囲む必要有り。


参考まで。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
merlionXXさんに作って頂いたマクロで、無事処理が出来ました。

お礼日時:2011/01/25 19:25

E1セルには次の式を入力し下方にオートフィルドラッグします。



=IF(LEFT(C1,2)<>"C'","",IF(SUMPRODUCT((A$1:A$1000=A1)*(LEFT(C$1:C$1000,1)="A"))+SUMPRODUCT((A$1:A$1000=A1)*(LEFT(C$1:C$1000,1)="B"))+SUMPRODUCT((A$1:A$1000=A1)*(LEFT(C$1:C$1000,1)="D"))+SUMPRODUCT((A$1:A$1000=A1)*(LEFT(C$1:C$1000,1)="E"))+SUMPRODUCT((A$1:A$1000=A1)*(LEFT(C$1:C$1000,1)="F"))>0,C1,""))
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
merlionXXさんに作って頂いたマクロで、無事処理が出来ました。

お礼日時:2011/01/25 19:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!