ウォッチ漫画『酒男子』新連載開始!

ExcelのVBAについて

Sub ああああ()

Dim i As Long
Dim ret As Variant
Dim ta As Worksheet
Dim s As Worksheet

Set ta = Worksheets("あああ")
Set s = Worksheets("いいい")


ret = Application.WorksheetFunction.Match(s.Range("A3"), ta.Range("A:A"), 1)
maxColumns = ta.Cells(ret, Columns.Count).End(xlToLeft).Column

For i = 2 To maxColumns

ta.Range(ta.Cells(ret, 1).Offset(0, 1), ta.Cells(ret, i)).Copy s.Range("B6")

Next



End Sub


上記のようなコードを使っています。普通に作動してます。
シートいいいのA3に入力された近似値で値をコピーしてます。

例 シートいいいのA3の値がAAA 

わからないことは、シートいいいに AAAという値が2つあった場合に、


シートあああ AAA⇒セルA1
シートあああ AAA⇒セルA25(こちらの値を参照したい)
このような場合にとのようにするのかがわからないのです。
お手数ですが、ご教示お願いします

質問者からの補足コメント

  • 返信ありがとうございます

    昇順に並んでいます。
    失礼しました。シートあああでした。

    シートあああ :10:00⇒セルA1(昨日)
    シートあああ :10:00⇒セルA30(本日)

    時間のみの表示です。セルA30の値を参照したいのです

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/07/27 17:45

A 回答 (3件)

No2です。

以下の関数を作って、それを呼び出してください。
MATCHの第1、第2パラメータをMyMatch1に指定します。(第3パラメータは1が指定されたケースの関数です)
呼び出し時の注意事項は以下の通り。
①セルのデータは昇順に並んでいる必要はありません。
②第2パラメータの範囲は。A1:A100のように指定してください。(A:Aと指定すると無限の範囲を検索するので終了しなくなります)
指定された範囲をすべて検索します。空白のセルは無視します。
③条件を満足するセルが複数の場合、それらのうち、最も後のセルの位置を返します。
④該当するセルがない場合は、0を返します。
⑤今回のケースなら、
ret = Application.WorksheetFunction.Match(s.Range("A3"), ta.Range("A:A"), 1) に代わりに
ret = MyMatch1(s.Range("A3"), ta.Range("A1:A1000"))
としてください。
(A1000の箇所はあなたの環境にあわせて指定してください。多少大目にとっても問題ありません.
A100000程度は問題ありません)
-------------------------------------------------------------------------
'第3パラメータが1のMATCH関数を自前で作成(data以下の最大値の位置を返す)(昇順に並んでいなくてもよい)
Private Function MyMatch1(ByVal data As Variant, ByVal rng As Range) As Long
MyMatch1 = 0
Dim rg As Range
Dim ctr As Long
Dim tval As Variant
ctr = 0
tval = Empty
For Each rg In rng
ctr = ctr + 1
If rg.Value <> "" Then
If rg.Value <= data Then
If tval = Empty Then
tval = rg.Value
MyMatch1 = ctr
Else
If rg.Value >= tval Then
tval = rg.Value
MyMatch1 = ctr
End If
End If
End If
End If
Next
End Function
    • good
    • 0
この回答へのお礼

すごいです。
いつか、私も tatsu99様のようなスキルを身につけれるように精進します。
本当にありがとうございました。
感謝感激です。

お礼日時:2019/07/28 10:42

No1です。


MATCH関数の動作をこちらで確認してみました。
シートあああのA2~A29のセルが空白(未設定)又は10:00の場合は、最後の行の10:00の位置が返ってこないケースがありますね。
MATCH関数がどのような基準で、その位置を返しているのかは不明です。
そのため、最後の行の10:00のデータを取得したいなら、自前のMATCH関数(もどき)をつくるしかなさそうですね。(MATCH関数の使用をしない)
そうすれば、MATCH関数のあいまいな仕様に振り回されることはありません。
よろしければ、自前のMATCH関数の提供は可能ですが、いかがでしょうか。
    • good
    • 0
この回答へのお礼

いただけるのであればめちゃくちゃうれしいです

お礼日時:2019/07/27 23:40

>わからないことは、シートいいいに AAAという値が2つあった場合に、


シートあああにAAAという値が2つあった場合に・・・の間違いではないでしょうか。

そうだとして、そもそも、MATCH(P1,P2,1)のように第3パラメータで1を指定する場合は、P2のデータが昇順で並んでいることが前提です。
このケースなら、シートあああのA列は昇順にならんでいなければいけません。そのようになっていますか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

返信ありがとうございます

昇順に並んでいます。
失礼しました。シートあああでした。

シートあああ :10:00⇒セルA1(昨日)
シートあああ :10:00⇒セルA30(本日)

時間のみの表示です。セルA30の値を参照したいのです

お礼日時:2019/07/27 17:44

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング