Excel VBA質問箱 IV

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

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


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

【79833】複数条件での最大日付取得 tsujio 18/4/26(木) 7:14 質問[未読]
【79834】Re:複数条件での最大日付取得 マナ 18/4/26(木) 19:07 発言[未読]
【79835】Re:複数条件での最大日付取得 tsujio 18/4/27(金) 7:01 発言[未読]
【79838】Re:複数条件での最大日付取得 マナ 18/4/28(土) 9:10 発言[未読]
【79840】Re:複数条件での最大日付取得 マナ 18/4/28(土) 12:36 発言[未読]
【79845】Re:複数条件での最大日付取得 tsujio 18/4/29(日) 6:13 お礼[未読]
【79846】Re:複数条件での最大日付取得 マナ 18/4/29(日) 7:48 発言[未読]
【79847】Re:複数条件での最大日付取得 tsujio 18/4/29(日) 8:44 お礼[未読]
【79848】Re:複数条件での最大日付取得 マナ 18/4/29(日) 10:31 発言[未読]
【79857】Re:複数条件での最大日付取得 tsujio 18/5/1(火) 8:04 お礼[未読]

【79833】複数条件での最大日付取得
質問  tsujio  - 18/4/26(木) 7:14 -

引用なし
パスワード
   お世話になります。

以下のデータが入力された行が400行ほどあります。

---------------------------------
列番号  1    2     3
行番号    
 1   受注 商品送付 入金確認
 2   4/10  4/10   4/11
---------------------------------

ステータスは列番号1→2→3の順に進んでいきます。

上記表の場合、「最新ステータス」表示セルに「商品送付」と返したいのですが、
同じ日付が入力されていると行によっては「受注」が返されてしまいます。

現在、

WorksheetFunction.Max

を使用し、対象範囲には日付が入力されている2行目を指定しています。

これを複数条件、

「同じ日付があれば列番号の大きい方を返す(上記の図だと「商品送付」)」

としたいのですが、dmaxでいけるのでしょうか。

試してみましたがうまくいきませんでした。

「2行目の中で最大、かつ列番号が大きいほう」の値を取得するにはどういう書き方があるのでしょうか。

よろしくお願いいたします。


※1行目の「受注」「商品送付」「入金確認」にはEnumでそれぞれ「1」「2」「3」を割り当てています。

【79834】Re:複数条件での最大日付取得
発言  マナ  - 18/4/26(木) 19:07 -

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

>ステータスは列番号1→2→3の順に進んでいきます。

ということならば

Worksheetfunction.Count
ではだめでしょうか。

というか、マクロを使う必要があるのでしょうか。

【79835】Re:複数条件での最大日付取得
発言  tsujio  - 18/4/27(金) 7:01 -

引用なし
パスワード
   ▼マナ さん:
>▼tsujio さん:
>
>>ステータスは列番号1→2→3の順に進んでいきます。
>
>ということならば
>
>Worksheetfunction.Count
>ではだめでしょうか。
>
>というか、マクロを使う必要があるのでしょうか。


返信有難うございます。

頂いた回答と自分の質問を見直してみたところ、質問自体が正確ではありませんでした。


正確には
---------------------------------
列番号  1    2     3
行番号    
 1   受注 商品送付 入金確認
 2   4/10  4/10   4/11
---------------------------------

は略しすぎで、正しくは

----------------------------------------------------
列番号 1      2      3   4    5
行番号    
 1  客名  最新ステータス 受注 商品送付 入金確認
 2  お客A   入金確認   4/10  4/11   4/11
----------------------------------------------------

の場合に最新ステータスの文言として(この場合は「入金確認」)を取得したい、でした。

この「お客A」と同様の行が400行ほどあります。

現在は

1.まずMAXで日付の最大値を取得→上記では4/11

2.その後4/11が入力されているセルの列番号を取得し→上記では「5」(を取得したい)

3.cells(2,2)の最新ステータス表示セルにはcells(1,5)の「入金確認」が表示される

としてます。

だいたいの行は意図通りに表示されるのですが、たまに「入金確認」ではなく
「商品送付」が最新ステータス表示セルに表示されてしまいます。

そうなると「最新ステータス列」でフィルターをかけたときに不正確な情報で絞り込まれてしまい、これをなんとかしたいのです。

で、

「同じ日付でも列番号の大きい方(ステータスが進んでいる方)を取得できないか」

と考えました。

調べてみるとdmaxが複数条件(日付が最大かつ列番号が最大)指定できそうでしたがうまくできませんでした。

もちろんマクロでも関数でも意図通りに表示できれば何でもいいです。

ヒントでも結構ですのできっかけを頂けると助かります。

【79838】Re:複数条件での最大日付取得
発言  マナ  - 18/4/28(土) 9:10 -

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

>もちろんマクロでも関数でも意図通りに表示できれば何でもいいです。

=IF(C2<>"",CHOOSE(COUNT(C2:E2),$C$1,$D$1,$E$1),"")

【79840】Re:複数条件での最大日付取得
発言  マナ  - 18/4/28(土) 12:36 -

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

これでよかったです。

=IF(C2="","",IF(D2="",$C$1,IF(E2="",$D$1,$E$1)))

【79845】Re:複数条件での最大日付取得
お礼  tsujio  - 18/4/29(日) 6:13 -

引用なし
パスワード
   ▼マナ さん:
>▼tsujio さん:
>
>これでよかったです。
>
>=IF(C2="","",IF(D2="",$C$1,IF(E2="",$D$1,$E$1)))

ありがとうございます。

なるほどそう考えれば良かったですね。
ややこしくしていました。

ステータス列は75列×顧客数400ですので、頂いたロジックをループで回します。

助かりました。

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

【79846】Re:複数条件での最大日付取得
発言  マナ  - 18/4/29(日) 7:48 -

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

>ステータス列は75列×顧客数400ですので

こんな感じでできませんか

=IF(C2="","",INDEX($C$1:$BY$1,1,COUNT(C2:BY2)))

関数は得意ではないので、もっとよい案があるかもしれません。
一般操作の掲示板で質問したほうがよかったと思います。

【79847】Re:複数条件での最大日付取得
お礼  tsujio  - 18/4/29(日) 8:44 -

引用なし
パスワード
   ▼マナ さん:
>▼tsujio さん:
>
>>ステータス列は75列×顧客数400ですので
>
>こんな感じでできませんか
>
>=IF(C2="","",INDEX($C$1:$BY$1,1,COUNT(C2:BY2)))


引き続きありがとうございます。
さきほど【79840】でご教示いただいた方法をマクロに置き換え思ったとおりの結果を得ることができました。

ありがとうございます。


>関数は得意ではないので、もっとよい案があるかもしれません。
>一般操作の掲示板で質問したほうがよかったと思います。

関数でシンプルに処理できる場合とVBAのほうが効率的な場合の切り分けがまだよくわかっていないですね。

もう少し勉強します。

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

【79848】Re:複数条件での最大日付取得
発言  マナ  - 18/4/29(日) 10:31 -

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

>さきほど【79840】でご教示いただいた方法をマクロに置き換え思ったとおりの結果を得ることができました。

こんな考え方でもよいかも。

Option Explicit

Sub test()
  Dim i As Long
  Dim 最終列 As Long
  
  For i = 2 To 4
    最終列 = Cells(i, Columns.Count).End(xlToLeft).Column
    If 最終列 >= 3 Then
      MsgBox Cells(1, 最終列).Value
    End If
  Next
    
End Sub

【79857】Re:複数条件での最大日付取得
お礼  tsujio E-MAIL  - 18/5/1(火) 8:04 -

引用なし
パスワード
   ▼マナ さん:
なるほど、1つずつセルを見ていくよりもそのほうが合理的な気がしますね。

処理速度も多少速くなるような。

ありがとうございます。

>▼tsujio さん:
>
>>さきほど【79840】でご教示いただいた方法をマクロに置き換え思ったとおりの結果を得ることができました。
>
>こんな考え方でもよいかも。
>
>Option Explicit
>
>Sub test()
>  Dim i As Long
>  Dim 最終列 As Long
>  
>  For i = 2 To 4
>    最終列 = Cells(i, Columns.Count).End(xlToLeft).Column
>    If 最終列 >= 3 Then
>      MsgBox Cells(1, 最終列).Value
>    End If
>  Next
>    
>End Sub

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