advanced help
per page, with , order by , clip by
Results of 1 - 1 of about 27302 for マクロ (0.014 sec.)
[[20060627171114]]
#score: 2167
@digest: 99383d72e9fd49453d6c12ef6110d5a1
@id: 23182
@mdate: 2006-07-07T10:27:24Z
@size: 24806
@type: text/plain
#keywords: nori2 (48690), nori (35559), 夕焼 (12785), c15 (9758), rouge (5056), seiya (4749), sheet2 (4279), sheet1 (4021), worksheets (3998), マク (3058), 数式 (2815), クロ (2748), コー (2645), ルド (2340), range (2303), 提示 (2260), フィ (2085), ード (2076), ドラ (2063), ダウ (2046), ィル (1983), ラッ (1965), ッグ (1935), 、sh (1933), 計算 (1863), value (1669), count (1347), 出来 (1326), with (1295), 記載 (1233), 表示 (1195), ウン (1189)
『計算式をマクロに…』(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) ...
https://www.excel.studio-kazu.jp/wiki/kazuwiki/200606/20060627171114.txt - [detail] - similar
PREV NEXT
Powered by Hyper Estraier 1.4.13, with 97050 documents and 608253 words.

訪問者:カウンタValid HTML 4.01 Transitional