[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『選択されたら数式復活』(VBA初心者)
皆様、よろしくお願いします。 A6〜A36はプルダウンになっているのですが、そのどれかが選択された場合、 隣のBC列(結合)には、例えば、『=IF(A6="","","●"』と数式を復活し、 DE列(結合)には例えば、『=IF(A6="","","○"』と数式を復活したい場合は どのように記述すればよろしいのでしょうか? どうぞよろしくお願いします。
数式を復活というのは、普段はどのようになっているのですか? また、掲示の式はA6に何か値があれば●や○が出るようになっていますが そのままでは何か不都合があるのですか?
(momo)
>掲示の式はA6に何か値があれば●や○が出るようになっていますが >そのままでは何か不都合があるのですか?
ありがとうございます。A列のプルダウンから選択せずに、結合されているBC列やDE列に直接入力したりされるケースや数式を消されていて いざ、プルダウンから選択しても反映されないことがあるので、もし消されていてもプルダウンから選択したら、数式が復活できれば便利だなぁ〜と思ったしだいです。 パソコンに詳しくない方も操作するため、保護をかけて数式をけされないようにしても、 ちゃんと説明も読まずに、入力できないとかなどと問合せがくることは目に見えてますので、 このような質問をいたしております。どうぞよろしくお願いします。
コメントをつければいいのでは。 例えば、「式が入っています。入力できません。」
プルダウンとは、何を指していますか?
単にセルの入力規則(リスト)の事ならば、イベントChangeで大方は拾えますが、 プルダウンそのものに対するイベントはありませんので、 プルダウンで選択した結果で、セルの値が変わらなければ発動しません。
そういった事を考えると、消されたく無い数式の入って居るセルは 保護しておくのが望ましいです。 #ちなみにマクロの内部への問い合わせ対応は、もっと大変ですよ^^;(はち)
> ちゃんと説明も読まずに、入力できないとかなどと問合せがくることは目に見えてますので ユーザー教育の絶好の機会です。 分かるまで説明をしたあとで、「周りの皆さんが困っていたら○○さんが教えてあげて下さいね」。 問い合わせてくるひとのなかには必ず、パソコンは不慣れだが頭が良くて教え好きなひとがいます。 そこらへん見極めたうえで、 同じ部署から同じ質問がまた来たときには「その件なら○○さんがよくご存知ですよ」。 わたしが説明するより部署内で教え合うほうがうまくいくのでしょうね。 あっというまにボトムアップします。
−佳− あ、様はカンベンして下さい。佳さんで結構です。
はちさんの >#ちなみにマクロの内部への問い合わせ対応は、もっと大変ですよ^^; これに大いに同意ですが・・・
でも、それも経験だと思いますし御自身でどちらが大変かを理解されるのも大切なので 一応、サンプルコードを載せておきます。 該当シートのモジュールに
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Application.Intersect(Target, Me.Range("A6:A36")) Is Nothing Then Exit Sub Target.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""","""",""●"")" Target.Offset(, 3).FormulaR1C1 = "=IF(RC[-3]="""","""",""○"")" End Sub
(momo)
ありがとうございます。 実際にはA列には、プルダウンでアルファベットが入ってます。AとかBとか・・・ BC列(結合)には=IF(A6="","",VLOOKUP(G8,$AR$36:$AT$42,2,FALSE)) DE列(結合)には=IF(A6="","",VLOOKUP(G8,$AR$36:$AT$42,3,FALSE)) と入力されています。BC列やDE列の数式を削除されても、プルダウンでアルファベットが選択 されたら、上記の数式を復活してほしいです。 momoさまにせっかくご教授いただきましたが、ofsetは難しくてよくわかりませんでしたので、 再度、コードを教えていただけると助かります。 よろしくお願いします!!!(VBA初心者)
OffSetはBC列とDE列を表しているだけですので数式にはなんら関係ありません。 その数式を入れる作業をマクロ記録を取ると マクロで扱える形(というか表現方法)の数式が得られるので それに差し替えるだけです。
こんな数式になると思います "=IF(RC[-1]="""","""",VLOOKUP(R[2]C[5],R36C44:R42C46,2,FALSE))" "=IF(RC[-3]="""","""",VLOOKUP(R[2]C[3],R36C44:R42C46,3,FALSE))"
(momo)
返事ありがとうございます。ご教授いただいたコードを張り付けて実行するとマクロ名が出ているマクロの選択画面?がでてきて、 うまく動作いたしません。どのようにしたらよろしいでしょうか?よろしくお願いします。(VBA初心者)
ん? 単独で実行するコードではありませんよ? A6:A36の範囲のセルの値を変更すると勝手に動くイベントプロシージャですので 動かしたいシートのモジュールに貼り付けておくだけでOKなはずですが (momo)
試験的にBC列やDE列の数式を削除してみてAのプルダウンから選択してみたら、何もかわりませんでした。
申し訳ありません。数式が間違っておりました。 BC列(結合)には=IF(A6="","",VLOOKUP(A6,$AR$36:$AT$42,2,FALSE)) DE列(結合)には=IF(A6="","",VLOOKUP(A6,$AR$36:$AT$42,3,FALSE))
もしよろしければ教えていただきたいのですが、momo様に記述していただいたコードは、 "=IF(RC[-3]="""","""",VLOOKUP(R[2]C[3],R36C44:R42C46,3,FALSE))"ですが、 普通に"=IF(A6="""","""",VLOOKUP(A6,$AR$36:$AT$42,2,FALSE))"ではいけないのでしょうか? momo様のコードは難しくて何をしているのかよくわかりません。もしよろしければ教えていただけませんでしょうか?(VBA初心者)
> "=IF(RC[-3]="""","""",VLOOKUP(R[2]C[3],R36C44:R42C46,3,FALSE))"ですが、 > 普通に"=IF(A6="""","""",VLOOKUP(A6,$AR$36:$AT$42,2,FALSE))"ではいけないのでしょうか? A6などの表記ですと6行目は問題ないですが36行目までありますので 全ての行にA6の数式を入れてもダメですよね? なので相対参照の式にしています。 Rは行(Row)Cは列(Column)の事で自分のセルから相対的にどこのセルの事かを表します。
B6セルからRC[-1]は同じ行の列が1つ左側なのでA6 R[2]C[3]は2行下の3列右なのでG8 R36C44:R42C46は数字が[]で囲まれてないので絶対参照で$AR$36:$AT$42 という事になります。 相対的に書いているのでこれがB7セルになっても同じ行列だけ移動した場所。という事で オートフィルしたのと同じように設定できるのです。
以下、コードにコメントをつけてみました。
'セルの値が変化したら動きます Private Sub Worksheet_Change(ByVal Target As Range) '値を変化させたセルの数が1を超えていたら終了します。 If Target.Count > 1 Then Exit Sub '値を変えたセルがA6:A36の範囲以外なら終了します。 If Application.Intersect(Target, Me.Range("A6:A36")) Is Nothing Then Exit Sub '値を変えたセルから右に1セル移動したセル(B列)の数式に""内の数式を設定します。 Target.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""","""",VLOOKUP(RC[-1],R36C44:R42C46,2,FALSE))" '値を変えたセルから右に3セル移動したセル(D列)の数式に""内の数式を設定します。 Target.Offset(, 3).FormulaR1C1 = "=IF(RC[-3]="""","""",VLOOKUP(RC[-3],R36C44:R42C46,3,FALSE))" End Sub
これでわかりますでしょうか?
(momo)
わざわざご丁寧に説明していただいてありがとうございました。 早速、メモさせていただきました^^ 教えていただいたコードなのですが、やはり結合セルの数式を削除してA列のプルダウンからアルファベットを選択しても数式復活して、セル何には入っておりません。 どのようにしたらよろしいか、おわかりになりましたら教えてください。(VBA初心者)
sub test() application.enableevents=true end sub
一度、このコードを実行した後に試してみてどうですか? (momo)
コードを入力し、実行してみましたが何も変わったことはなく何もおきないようです。 よろしくお願いします。(vba初心者)
う〜ん・・・
Private Sub Worksheet_Change(ByVal Target As Range) の後に MsgBox "マクロは動いてます"
と入れてみてA列のリストを変えるとメッセージは出ますか?
(momo)
ただいま、下記のようなコードをすべてコピーして張り付け、A列のプルダウンからアルファベットを選択してみましたが、何も変わらず何も出てきません。
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "マクロは動いてます" If Target.Count > 1 Then Exit Sub If Application.Intersect(Target, Me.Range("A6:A36")) Is Nothing Then Exit Sub Target.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""","""",VLOOKUP(R[2]C[5],R36C44:R42C46,2,FALSE))" Target.Offset(, 3).FormulaR1C1 = "=IF(RC[-3]="""","""",VLOOKUP(R[2]C[3],R36C44:R42C46,3,FALSE))" End Sub
お手数をおかけしまして申し訳ありません(VBA初心者)
ん〜だとすると コードを書いている場所はどこでしょう? 使うシートのタブを右クリックしてコードの表示で出てくる所に貼り付けていますか?
標準モジュールやThisworkbookモジュールでは動きませんので。
(momo)
ほんとにありがとうございました!!!! おっしゃる通りでした。一般の標準モジュールに作成していて動かず、sheet1のコードウィンドウに作成したらしっかり動作しましたー。 この度は大変勉強になりました。ありがとうございました。 標準モジュールで動くのとそうでないものがあるのを、初めて知りました。 ありがとうございました(vba初心者)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.