[[20060627171114]] 『計算式をマクロに…』(Nori) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『計算式をマクロに…』(Nori)

 いつもお世話になります。今回も教えて下さい。
 既にセルに入力されている計算式をマクロにしたいのですが、
 出来るでしょうか?もし出来るのであれば、どうすればいいでしょうか?
 ヘルプや過去ログを見ましたけど、良く分かりませんでした。
 マクロの初心者ですので、どうぞお願いします。


 二通り(もっと?!)の答えが得られるでしょう。
 1.数式を入力するマクロ
 2.計算結果を返すマクロ
 どのようなものをしたいのか分かりませんのでとりあえず。
 (ROUGE)

 マクロの記録

 [ツール]->[マクロ]->[マクロの記録]

 すでに数式の入っているセルをクリックしてF2,その後Enterで抜けて記録を終了

 マクロが記録されると思いますが?
 (seiya)

 ROUGEさん。
 現在入力されている数式の計算と同じ事をマクロでやりたいのです。
 ですが、自分がマクロを組む事が出来ないのです。

 seiyaさん。
 ↑のやり方でやってみましたが、うまく行きませんでした。
 今使っている数式は、配列数式を組んであるのですがそれで、ダメなのでしょうか?

 (Nori)

 えっ?

 F2の変わりに、数式バーをクリックしてShift + Ctr + Enterしてみてください。

 (seiya)

 数式の提示がないと、σ(^-^;)にも組む事ができません・・・orz
 (ROUGE) ※提示されても組めるかどうかはわかりませんが・・・

 ひょっとして、計算式の内容そのものをコードにする?ってことかな?
 私のは、セルに入力されている計算式をコードにするものですよ。
 だから
 ActiveCell.FormulaArray = "=....."
 と言うような形になると思いますが?

 (seiya)

 seiyaさんへ
 ActiveCell.FormulaArray = "=....."の『.....』に今入力されている数式を
 そのままコピペすれば、いいのでしょうか?
 また、数式をフィルドラッグして入力してあるのですが、その場合はどのように
 記入すればいいのでしょうか?

 ROUGEさんへ
 何種類か数式を使っているので、1つ提示します。
 C15={IF(COUNTIF(Sheet2!$L$8:$L$6138,$B$5)<ROW(A1),"",INDEX(Sheet2!$M$8:$M$6138,
 SMALL(IF(Sheet2!$L$8:$L$6138=$B$5,ROW($A$1:$A$6131),""),ROW(A1)),COLUMN(A1)))}

 (Nori)

 Noriさん
 正直なところ、σ(^-^;)はこの手の数式の解読が苦手なので、意図するところが合っているか
 確認ですが、Sheet1のB5を検索値として、Sheet2のL8:L6138の中で合致するものを探し、そ
 れに対応するM列のものを抜き出してくる、ということでよろしかったですか?
 数式を提示して下さいといいながら、実は文章の方が早かったりして・・・
 (ROUGE)

 ROUGEさん
 おはようございます。
 数式の内容ですが、ROUGEさんが考えている通りです。
 (Nori)

 だとするとこんな感じでしょうか?
(すみません。検証する時間がございません。今から飛行機に乗るので、レスが遅くなります)
Sub Nori()
Dim ksk As String
Dim myA
Dim i As Long
ksk = Worksheets("Sheet1").Range("B5").Text
With Worksheets("Sheet2")
myA = .Range("L8:M" & .Range("M" & Rows.Count).End(xlUp).Row)
End With
With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(myA, 1)
If myA(i, 1) = ksk Then .Add i, myA(i, 2)
Next
Worksheets("Sheet1").Range("C15").Resize(.Count, 1).Value = _
Application.Transpose(Application.Transpose(.Items))
End With
Erase myA
End Sub
(ROUGE)

 ROUGEさん
 レスありがとうございます。
 早速試してみました。ですが、私の説明不足だったの可能性があります。
 C列に必要分抜き出されて、表示されたのですが、全てC15と同じ値が表示されてしまいます。
 再度説明しますと、数式での計算では先に記載した数式をフィルドラッグして使用しています。
 C15={IF(COUNTIF(Sheet2!$L$8:$L$6138,$B$5)<ROW(A1),"",INDEX(Sheet2!$M$8:$M$6138,
                        ^^
 SMALL(IF(Sheet2!$L$8:$L$6138=$B$5,ROW($A$1:$A$6131),""),ROW(A1)),COLUMN(A1)))}
                               ^^     ^^
 ↑の^^部位がフィルドラッグにてA1⇒A2⇒A3……と変わっています。
 今は飛行機の中でしょうか?飛行機揺れなければいいですね
 (Nori)

 >数式をフィルドラッグ....

 Range("C15:C100").FormualaArray = "=C15に記述されている数式"

 (seiya)

 ケンショウブソクデシタ
お詫びにおまけをつけています。
  
以下をSheet1のモジュールへ
'----
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Address(0, 0) <> "B5" Then Exit Sub
Call Nori
End Sub
'----
以下を標準モジュールへ
'----
Sub Nori()
Dim ksk As String
Dim myA
Dim i As Long
With Worksheets("Sheet1")
    ksk = .Range("B5").Value
    .Range("C15:C" & .Range("C" & Rows.Count).End(xlUp).Row).ClearContents
End With
With Worksheets("Sheet2")
    myA = .Range("L8:M" & .Range("M" & Rows.Count).End(xlUp).Row)
End With
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(myA, 1)
        If myA(i, 1) = ksk Then
            .Add i, myA(i, 2)
        End If
    Next
    If .Count > 0 Then
    Worksheets("Sheet1").Range("C15").Resize(.Count, 1).Value = _
    Application.Transpose(.Items)
    End If
End With
Erase myA
End Sub
'----
(ROUGE)

 途中から失礼します。経過をよく読んでいませんので外れているかも
しれませんが,こういうことではないでしょうか。
外れていたら,無視してください。
  たとえば,一般的に セルに計算式を入れてそのセルに値を表示させて
   いますよね。例えば  A1の値と,B1の値の積から30引いた値
     をC1に表示させるには C1セルに=A1*B1-30と記載しますね。

 質問者は同じ計算を,セルに記載せずに,マクロで計算させて結果を
 同じように C1に表示する手法(サンプル)を求めているのではないで
 しょうか。
    以下のコードのマクロを実行すれば,セルになにも記載しておかなくても
結果が得られます。

Sub 計算例()

Data1 = Cells(1, 1)

Data2 = Cells(1, 2)

kotae = Data1 * Data2 - 30

Cells(1, 3) = kotae

End Sub

  このような要領で,複雑な計算や論理計算も
 マクロで処理して,結果をセルに記載出きる
のです。  (夕焼)


 夕焼さん、仰ることはごもっともですが、今回の配列数式をそのように具現化するスキルが
ございませんので、得られる結果が同じものを提示いたしました。
Noriさん提示の数式を仰る要領で記載して頂くと、私の勉強にもなりますので、ぜひとも提示
してください。
なお、変数の宣言、親オブジェクト、プロパティなどは明示されていた方が良いかと存じます。
(ROUGE)

 >このような要領で........

 もし質問者が実際その方法を質問しているとしたら、
 質問内容に則したコードを具体的に提示すべきでは?

 (seiya)

 >則したコードを具体的に

 途中を詳細に読みませんでしたが,最初の質問ではセル内の式自身には
触れておらず,一般論的にマクロを使った計算方法(や取扱と解釈)自身を
知りたかったと思います。ですので,簡単な例題を取扱例として示したまでです。
  正直言って,マクロ初心者ではこのような基本計算((ROUGE)さんの御指摘の
ように完璧 ではありませんが。)から理解していかないと,突然途中で出て来た
難しいそうな式をマクロ化することは,初心者としてマクロを使った計算を
勉強するには,急すぎるように思います。 徐々に,スキルを上げて取り組めば
いいのではないでしょうか。
  目的が,単に,例示式のマクロへの置換えそのものにあって,勉強や理解は
2次的なことであるということであれば, (seiya)さん のおっしゃるとおりで,
不足ですが,わたしは初期の理解しやすい例として示しただけです。
                      (夕焼)

 私はこう考えます。
 第一は質問者の問題を解決する事です。
 思い通りに動くコードがあれば、そこから勉強出来ます。
 分からなければ、質問すればよいのです。

 何が初心者にわかりやすくて、何が初心者にわかりづらいかは
 我々が判断する事ではないと思います。
 「勉強」という事であれば、きちんと変数の宣言をして、
 Propertyも省略せずに記述すべきだと思いますが?

 (seiya)

 >第一は質問者の問題を解決する事です。

 そうですね。私は,それが最初の質問「計算式をマクロにしたいのですが
   -----どうすればいいでしょうか?」
  とありましたので,式自体の内容うんぬんではなく,マクロで計算をどの
 ように実現するのだろうという,最初の一歩からスタートしたいのではないかと
 思ったわけです。式の内容は,具体例として,一例として表示された程度にしか
 わたしにはおもえませんでした。
   どちらでもかまわないとおもいますが,質問者の方が,マクロは難しいと
 と驚いて,マクロ嫌いにならなければいいと思っています。
        (夕焼)


 それと質問者に対する私のアドバイスとして,もう一つあげさせていただきます。
それは
 マクロ(VBA)を使って,計算の処理をする場合に,いままでのセルに計算式を
書いていたものを,その式そのものを変換的,機械的にマクロへ変換するという
考え方でなく,マクロを使って,最初からマクロ用にコード・式を組立てるという
ふうに考えられる方が,結局はいいコードが書けるようになっていくのでは
ないでしょうか。
 つまり,セルに書いた(書いてある)式を基本にするのでなく,自分がやりたい
ことを,そのものをベースにしてどのような式がいいかもう一度考えて,
マクロで構築していくということです。(夕焼)

 夕焼けさん
 ROUGEさんから、是非ともご提示ください、とありますが?
 それと、変数の宣言、とPropertyの省略の件は?

 (seiya)

 Noriさんのために基本的な構文で書いてみました。
'----
Sub Nori2()
Dim l_r As Long, i As Long
With Worksheets("Sheet1")
    .Range("C15:C" & .Range("C" & Rows.Count).End(xlUp).Row).ClearContents
End With
With Worksheets("Sheet2")
    l_r = .Range("L" & Rows.Count).End(xlUp).Row
    For i = 8 To l_r
        If .Cells(i, "L").Value = Worksheets("Sheet1").Range("B5").Value Then
            If Worksheets("Sheet1").Range("C15").Value = "" Then
                Worksheets("Sheet1").Range("C15").Value = .Cells(i, "M").Value
            Else
                Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Offset(1).Value = _
                .Cells(i, "M").Value
            End If
        End If
    Next
End With
End Sub
'----
夕焼さん、当初仰っていた配列数式のコード化はどうなりましたか?
非常に気になっています。
ちなみにseiyaさんにも賛同頂きましたが、変数の宣言は必ずした方が良いと思います。
私はOption Explicitを常に表示させていますよ。
ミスタイプしてコンパイルが通ってしまうことだって考えられます。
(ROUGE)

 >是非ともご提示ください
 >配列数式のコード化はどうなりましたか?

 すでに何回か上記に書いてあるとおり
 >わたしは初期の理解しやすい例として示しただけです。

  ので,セルの特定式のコード化そのことには関心はありません。
  関心のある先生方で解決してください。
         (夕焼)


 概念だけで、物事解決出来ませんよ?
 変数の宣言、Propertyの記述、エラー処理の出来てないコードは
 勉強にはなりません!

 (seiya)


 ROUGEさん、seiyaさん、夕焼さん
 いろいろと考えて頂き、ありがとうございます。
 私の意見としては、なぜ、今入力してある数式をマクロにしたいかと言うと、
 @:複数のシートに数式がかなり入力してあり、計算に時間が掛かる為。
 A:マクロを勉強したい為。
 上記の事がありますが、マクロについては全く知らない為、今回この場を借りて、
 質問をさせて頂きました。
 私個人としては、実際使用している数式を提示し、その数式と同じ動作を行えるマクロを知りたかったのです。
 そして、実際に同じ動作をするコードが分かれば、そこからマクロについて徐々に理解していけるかと思ったのです。

 seiyaさん
 先程、教えて頂いたフィルドラッグのコードですが、実際にやってみた所、
 必要箇所までフィルドラッグ出来たのですが、セルに表示される内容が全て同じでした。
 >C15={IF(COUNTIF(Sheet2!$L$8:$L$6138,$B$5)<ROW(A1),"",INDEX(Sheet2!$M$8:$M$6138,
                         ^^
 >SMALL(IF(Sheet2!$L$8:$L$6138=$B$5,ROW($A$1:$A$6131),""),ROW(A1)),COLUMN(A1)))}
                                ^^     ^^
 >↑の^^部位がフィルドラッグにてA1⇒A2⇒A3……と変わっています。
 ↑の動作が出来ませんでした。

 ROUGEさん
 先程教えて頂いたコード早速試してみました。
 希望通りの動作をしたのですが、1点問題です。
 セルの表示をC:15から行う様になっているのですが、
 マクロを実行すると、C:14に入力されている文字列が消えてしまいました。
 (Nori)


 Noriさん、それでしたら

 一旦、C15に数式を入れてCtrl + Shif + Enter で確定する。
 必要分フィルドラッグする。

 これをマクロの記録してください。

 AutoFill Range("C15:C100"), xlFillDefault

 とか記録されるはずです。
 (seiya)


 ありゃりゃ、本当ですね(^^A;
 >   .Range("C15:C" & .Range("C" & Rows.Count).End(xlUp).Row).ClearContents
の前に
    If .Range("C15").Value <> "" Then _
の一文を追加して下さい。(Nori、Nori2いずれも)
(ROUGE)

 Seiyaさん
 >一旦、C15に数式を入れてCtrl + Shif + Enter で確定する。
 >必要分フィルドラッグする。
 ↑のやり方で出来ました。1つの列で、出来たので同じように別の列もやってみたのですが、
 そうすると、エラーが出てしまいます。

 ROUGEさん
 > If .Range("C15").Value <> "" Then _
 を追加して出来ました。
 ですが、参照先に空白セルがあると、参照元に表示する際に、参照先の空白セルが無視され、数値(文字列)が入力されているセルしか表示がされません。
 (Nori)

 Nori2だとそういうこともあるでしょうね・・・orz
 Noriだと大丈夫ですか?
 (ROUGE)

 そのコードをご提示ください。
 (seiya)

 ROUGEさんへ
 Noriのコードでしたら、空白はちゃんと認識されています。

 seiyaさんへ
 コード提示します。

 Option Explicit

Sub Macro12()

    Selection.FormulaArray = _
        "=IF(COUNTIF(sheet1!R8C12:R6138C12,R5C2)<ROW(R[-14]C[-2]),"""",INDEX(sheet1!R8C13:R6138C13,
 SMALL(IF(sheet1!R8C12:R6138C12=R5C2,ROW(R1C1:R6131C1),""""),ROW(R[-14]C[-2])),COLUMN(R[-14]C[-2])))"
    Selection.AutoFill Destination:=Range("C15:C44"), Type:=xlFillDefault
    Range("C15:C44").Select
    Range("C15").Select

    Selection.FormulaArray = _
        "=IF(COUNTIF(sheet1!R8C12:R6138C12,R5C2)<ROW(R[-14]C[-6]),"""",INDEX(sheet1!R8C14:R6138C14,
 SMALL(IF(sheet1!R8C12:R6138C12=R5C2,ROW(R1C1:R6131C1),""""),ROW(R[-14]C[-6])),COLUMN(R[-14]C[-6])))"
    Selection.AutoFill Destination:=Range("G15:G44"), Type:=xlFillDefault
    Range("G15:G44").Select
    Range("G15").Select
End Sub
 (Nori)

 もし、数式を挿入して、任意のセルまでフィルダウン・オートフィルがお望みでしたら

 With Range("c15")
      .FormulaArray = "=If(CountIf(Sheet1!........)"
      .AutoFill Destination:=.Resize(30), Type:=xlFillDefault
      With .Resize(30)
          .Value = .Value
      End With
 End With

 で数式を入力、フィルダウン、値として確定
 になると思います
 (seiya)

 seiyaさん
 ↑の式を使った所、任意のセルまで、フィルダウン出来たのですが、
 全てのセルの値が同じになってしまいます。
 (Nori)

 やっと復旧したみたいですね^^
Nori2を修正しました。
(ROUGE)
'----
Sub Nori2()
Dim l_r As Long, i As Long, n As Long
Worksheets("Sheet1").Range("C15:C" & Rows.Count).ClearContents
With Worksheets("Sheet2")
    l_r = .Range("L" & Rows.Count).End(xlUp).Row
    n = 15
    For i = 8 To l_r
        If .Cells(i, "L").Value = Worksheets("Sheet1").Range("B5").Value Then
            Worksheets("Sheet1").Range("C" & n).Value = .Cells(i, "M").Value
            n = n + 1
        End If
    Next
End With
End Sub

 手作業でフィルダウンした時は如何ですか?
 (seiya)

 手作業でフィルダウンをした、マクロではうまく行きます。
 ですが、マクロ登録時に数式を入力したセル以外の所を選んでいる時に
 マクロを実行するとエラーが出てしまいます。
 (Nori)

 seiyaさん、すいませんでした。
 私がオッチョコチョイでした。計算方法が「手動」になっていた為、
 出来ていませんでした。
 「自動」にした所、出来ました。すいませんでした。
 (Nori)

 ROUGEさん
 修正してくれた、Nori2で理想通りの事が出来ました。ありがとうございます。
 それと、今Nori2では、B5に入力された値について検索し、表示していますが、
 そうではなく、Nori2のマクロで実行された値について検索するにはどうしたらよいでしょうか?
 Nori2のコードで検索に対応していそうな所を変更してみたのですが、空白しか表示されません。
 (Nori)

 マクロで実行された値について検索するとはどういうことでしょうか?
 ちょっとイメージできません・・・orz
 (ROUGE)

 別の言い方で説明しますと、Nori2のマクロを実行すると、Sheet1のB5に入力された値について、
 Sheet2のL列を検索し、B5の値とSheet2のL列の値が合致して行のSheet2のM列の数値を
 C15から順に合致した分だけ表示していくマクロだと思います。(私の解釈が正しければ…)
 私が教えて頂きたい事は、Nori2のマクロで表示されたC列の数値(例えばC15:C20)を使用し
 再度検索し、Sheet1の別の列に表示したいのです。(この説明で分かるでしょうか?)
 それと、追加の質問で申し訳ないのですが、検索したセルが「空白」の場合、「0」を表示するには、
 どういったコードを追加すればよいのでしょうか?
 (Nori)

 レスが無い様なので、申し訳ないですが、別の質問をさせて頂きます。
 N15=IF(COUNTIF(Sheet2!$C$9:$C$1202,$C15)<ROW($A$1),"",INDEX(Sheet2!$H$9:$H$1202,
 SMALL(IF(Sheet2!$C$9:$C$1202=$C15,ROW($A$1:$A$1194),""),ROW($A$1)),COLUMN($A$1)))をマクロでやるにはどうしたらよいでしょうか?
 ここで、同じ様な式のコードを教えてもらい、自分でいろいろ考えてやってみたのですが、どうにもうまく行きません。
 どうか、ご教授をお願いします。
 (Nori)

 他の方からレスがあるかも知れませんが、今σ(^-^;)はまとまった時間を取れそうにありません。
 明日夜にでも検討しようかと思っていますので、もしお急ぎでなければお待ち下さい。

 コッソリ
 数式の意味も書いておいて頂けると助かりますネン♪
 (ROUGE)

 数式の解読にあまり自信はありませんが...

 Sub test()
 Dim c As Range, r As Range, rng As Range, Ans
 For Each c In Sheets("Sheet1").Range("n15:n44") '変更 13:49
     With Sheets("Sheet2")
         Set rng = .Range("c9:c1202")
         Set r = rng.Find(c.Offset(, -11).Value,rng.Cells(rng.Count),,xlWhole) 'ここ
         If Not r Is Nothing Then
             Ans = r.Offset(, 5).Value
         Else
             Ans = ""
         End If
     End With
     c.Value = Ans
     Ans = ""
 Next
 Set rng = Nothing
 End Sub

 (seiya)

 ROUGEさん。御忙しい所、ありがとうございます。
 お待ちしておりますので、御検討をお願いします。
 >数式の意味も書いておいて頂けると助かりますネン♪
 数式の意味はSheet1のC15に入力されている値をSheet2のC9:C1202から検索し、
 Sheet2のC列にて合致した行のH列の値をSheet1のH15に表示する。
 例:Sheet1のC15の検索値がSheet2のC100にあった場合、Sheet2のH100の値をSheet1のH15に表示する。
 と言う感じですが、分かりますでしょうか?
 また、今は↑の数式をSheet1のN15:N44で、フィルダウンして使用しています。
 (Nori)

 seiyaさん。コードの作成ありがとうございます。
 数式通りの事が出来ております。
 お手数なのですが、今↑の数式をC15:C44にてフィルダウンして使用しています。
 その様に出来ますでしょうか?
 (Nori)

 上記コードを修正してありますので、試してください。(seiya)

 seiyaさん。バッチシ出来ておりました。
 ですが、私が間違えて説明してしまいました。すいませんでした。
 >今↑の数式をC15:C44にてフィルダウンして使用しています。
 と書きましたが、N15:N44の間違いでした。

 ROUGEさん、数式の説明を間違えておりましたので、修正しました。
 (Nori)

 seiyaさん。再修正して頂いたコードを試してみました。
 ですが、マクロは実行されているのですが、何も表示がされません。
 C列に表示している時は、数値が表示されたのですが、N列に変更したコードでは
 空白しか表示がされません。
 (Nori)

 でしたね。
 訂正しました。
 (seiya)

 大変遅くなりました・・・orz
 seiya大先生からすでにレスがついていますが、Dictionaryでやってみました^^
'----
Sub Nori3()
Dim tbl
Dim i As Long
Worksheets("Sheet1").Range("H15:H" & Rows.Count).ClearContents
With Worksheets("Sheet2")
    tbl = .Range("C9:H" & .Range("C" & Rows.Count).End(xlUp).Row)
End With
With CreateObject("Scripting.Dictionary")
    On Error Resume Next
    For i = 1 To UBound(tbl, 1)
        .Add tbl(i, 1), tbl(i, 6)
    Next
    On Error GoTo 0
Erase tbl
    If Worksheets("Sheet1").Range("C15").Value <> "" Then
        For i = 15 To Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row
            Worksheets("Sheet1").Range("H" & i).Value = _
            .Item(Worksheets("Sheet1").Cells(i, 3).Value)
        Next
    End If
End With
End Sub
'----
'(ROUGE)

 ROUGEさん、seiyaさんありがとうございます。
 御二人に提示して頂いた、コードは両方とも同じ動作が出来ました。
 ありがとうございます。
 Sub Sample()
 Dim l_r As Long, i As Long, n As Long
 With Worksheets("Sheet2")
    l_r = .Range("D" & Rows.Count).End(xlUp).Row
    n = 5
    For i = 8 To l_r
        If .Cells(i, "D").Value = Worksheets("Sheet1").Range("B5").Value Then
            Worksheets("Sheet1").Range("D" & n).Value = .Cells(i, "E").Value
            n = n + 1
        End If
    Next
 End With
 End Sub
 何回も申し訳ないのですが、今↑のコードを使用し、結果をSheet1のD5に表示しています。
 ですが、Sheet1:B5に値が入力されていない状態で、Sheet1:E5に値を入力して↑のコードを実行すると、おかしな動作が始まってしまいます。
 なぜでしょうか?
 (Nori)


 Sheet1のモジュールにこれが残っていませんか?
(ROUGE)
'----
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Address(0, 0) <> "B5" Then Exit Sub
Call Nori
End Sub

 ROUGEさん
 Sheet1のモジュールには↑のコードは残っていません。
 (Nori)

 Noriさんのコードをみると、Sheet2のD列にSheet1のB5と同じ値があった場合に、Sheet2のE列のデータを
 引っ張ってくるということですが、やりたいこととあっていますか?
 Sheet1!B5を空白としているのであれば、Sheet2!D列が空白の場合にデータが抽出されているようですが?
 (ROUGE)

 少し違うのですが、「Sheet2のC列にSheet1のB5と同じ値があった場合に、
 Sheet2のD列のデータを引っ張って来る」と言うコードだと思うのですが違うのでしょうか??
 できれば、Sheet1のB5が空白であれば、Sheet1のD5は空白にしておきたいのですが…
 (Nori)

 NoriさんのSampleに説明をつけました。
'----
 Sub Sample()                                    'Sampleというマクロでっせ。
 Dim l_r As Long, i As Long, n As Long           '変数「l_r」「i」「n」を長整数型で宣言しますた。
 With Worksheets("Sheet2")                       'Sheet2での作業に入ります〜。
    l_r = .Range("D" & Rows.Count).End(xlUp).Row 'l_rはSheet2のD列最終行の番号でおながいします。
    n = 5                                        'とりあえず n は 5 で。
    For i = 8 To l_r                             'ループ開始。ただし、i は 8 から始めて、l_rまで。
        If .Cells(i, "D").Value = Worksheets("Sheet1").Range("B5").Value Then
                                                 '"もし"Sheet2のD列、i行目の値がSheet1のB5の値と一緒ならば、
            Worksheets("Sheet1").Range("D" & n).Value = .Cells(i, "E").Value
                                                 'Sheet1のD列n行目の値は、Sheet2のE列i行目の値としよ〜っと。
            n = n + 1                            'nに1足しとこ。
        End If                                   '"もし"は終わり
    Next                                         'もっかいループ。
 End With                                        'Sheet2での作業終了。
 End Sub                                         'Sample終わり。

 ということですので、やりたいことと乖離があるようです。
(ROUGE)

 ROUGEさんの書いてくれた説明で、コードの意味が分かりました。
 ですが、私が思う限り合っているような気がするのですが…
 私のコードの解釈が違うのでしょうか?
 作業シートはSheet2ですが、作業シートで検索した値を表示するシートはマクロを実行したシートでいいのですよね?
 (Nori)

 > 「Sheet2のC列にSheet1のB5と同じ値があった場合に、Sheet2のD列のデータを引っ張って来る」
ではなくて、
「Sheet2のD列にSheet1のB5と同じ値があった場合に、Sheet2のE列のデータを引っ張って来る」
         ~~                                           ~~
です^^;

 検索列:Sheet2!C:C、抽出元データ:Sheet2!D:D であれば、
 > If .Cells(i, "C").Value = Worksheets("Sheet1").Range("B5").Value Then
 > Worksheets("Sheet1").Range("D" & n).Value = .Cells(i, "D").Value
ですね。
Sheet1!D5が何の関連があるのかはわかりませんでした・・・orz
(ROUGE)

 ROUGEさん。分かりました。
 ROUGEさんの指摘通りです。私の↓の説明が間違っていました。すいませんでした。
 > 「Sheet2のC列にSheet1のB5と同じ値があった場合に、Sheet2のD列のデータを引っ張って来る」
 ですが、私が提示したコードですと、Sheet1のB5に入力されている値について検索をするはずですが、Sheet1のB5に値が入力されてなく、Sheet1のE5に値が入力されている状態でマクロを実行すると、Sheet2のE列の値が表示されてしまいます。
 (Nori)

 先日、このスレッドで、seiyaさんに↓のコードを教えて貰いました。
 Sub test()
 Dim c As Range, r As Range, rng As Range, Ans
 For Each c In Sheets("Sheet1").Range("n15:n44")
     With Sheets("Sheet2")
         Set rng = .Range("c9:c1202")
         Set r = rng.Find(c.Offset(, -11).Value,rng.Cells(rng.Count),,xlWhole) 
         If Not r Is Nothing Then
             Ans = r.Offset(, 5).Value
         Else
             Ans = ""
         End If
     End With
     c.Value = Ans
     Ans = ""
 Next
 Set rng = Nothing
 End Sub

 今、このコードを使用しているのですが、値の参照先の行数(Sheet2のC列)が変わってしまい、
 その都度、コードを書き換えなければいけません。
 ですので、行が増えても書き換えをしなくていいようにしたいのです。
 他に教えてもらったコードでは※列の最終行まで参照するというコードがあるのですが、
 それを基に書き換えをしているのですが、どうしてもエラーが出てしまいます。
 どうかお力をお貸し下さい。(Nori)


 Noriさ〜ん、σ(^-^;)のNori3ならば、C列の行数変化に対応していますよ^^
 (ROUGE)

 Set rng = .Range("c9",.Range("c" & Rows.Count).End(xlUp))
 にしてください。 (seiya)

 ROUGEさん、seiyaさん、ありがとうございます。
 出来ました。
 長い間、お付き合いをして頂き、ありがとうございます。
 今後、ご縁があれば、その時は宜しくお願いします。
 (Nori)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.