- ベストアンサー
エクセル関数
こんにちは、エクセルでこんなこと出来ますか?教えてください。 例 acbadcbba 935841621 セルにa~dの文字を入力し、それに対する値を入力していきます。 順次入力していきますが、常にa~dの値を別なセルに表示させたいのですが、可能でしょうか? 上記の例では、aは1 bは2 cは1 dは4 です。 可能でしたら、方法を教えてください。よろしくお願いします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
#2です。例によって関数ではなくVBAですが、縦に入力する場合の方法を書いておきます。 #2のコードのOffset(-1)のところを、Offset(,-1)に変更するだけです。 一応、今回のコードの説明を書いておきますね。ご参考までに。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) →開いているブックの中にあるシートが変更されたとき、下記のコードを実行する (同時に、変更されたセルをTargetという引数に格納する) On Error GoTo er →エラーが発生したときはer:にジャンプして、何もせずに終了させる If Target.Offset(,-1).Value = "a" Then Range("f10") = Target.Value →もしTargetの左のセルが"a"だったら、F10セルにTargetの値を入れる(以下4行同じ) er: →エラー発生時のジャンプ先(左端のセルを変更した時、上の行がエラーとなってしまうため) End Sub →コード終了の宣言
その他の回答 (9)
- sakenomo
- ベストアンサー率52% (35/67)
#8です。 すみません。下の式は、B列の行数がA列の行数より少ないと、正確な答えを返しませんでした。なかなか難しいですね。
お礼
いろいろ考えてくれてありがとう御座います。 本当に難しいですよね!ちょっとしたものを作ろうと考えて始めたものなのに、なかなか進まなくって.....
- sakenomo
- ベストアンサー率52% (35/67)
#7です。 A列にアルファベット、B列に数字。 D1にa、D2にb、D3にc、D4にdとして、 E1に以下を入れ、数式バーにカーソルがあるうちに、ShiftキーとCtrlキーを同時に押しながらEnterキーを押下、下へオートフィルでいかがでしょう。 =IF(ISERROR(MATCH($D1,A:A,0)),"",INDEX($B:$B,MAX(IF($A$1:$A$10000=$D1,ROW($A$1:$A$10000),""),1)))
- sakenomo
- ベストアンサー率52% (35/67)
#5です。 前回の式では入力する値の桁数が少ないと、不正確な結果を出してしまいました。修正案です、より複雑になってしまいました。もっと簡潔に出来そうな気もするのですが・・・。 数式バーにカーソルがあるうちに、ShiftキーとCtrlキーを同時に押しながらEnterキーを押してください。 =IF(ISERR(FIND(A4,RIGHT($A$1,LEN($A$2)),1)),"",LEFT(RIGHT($A$2,SMALL(IF(LEFT(RIGHT($A$1,ROW($A:$A)),1)=A4,ROW($A:$A)),1)),1))
- inte-nori
- ベストアンサー率48% (33/68)
#2で答えた者ですが、 また、#2では「1行目にa~d、2行目に値」と書きましたが、数値を入力した時に すぐ上のセルの文字を判定するようになっているので、「a~d」と「値」の間に 空欄がなければ、1、2行目以外でも大丈夫です。
お礼
実際は縦に使用するつもりなので、皆さんの回答を理解出来るように頭フル回転中です(あまり回りません)。 ところで、関数では無理なのでしょうか?
- sakenomo
- ベストアンサー率52% (35/67)
関数でやってみました。 A 1 acbadcbba 2 935841621 3 4 a 5 b 6 c 7 d として、任意のセルに下をコピーし、まだ数式バーにカーソルがあるうちにShiftキーとCtrlキーを同時に押しながらEnterキーを押します。数式の両脇に{}が付きます。その後オートフィルで下へコピー。 =LEFT(RIGHT($A$2,SMALL(IF(LEFT(RIGHT($A$1,ROW($A$1:$A$20)),1)=A4,ROW($A$1:$A$20)),1)),1)
- comv
- ベストアンサー率52% (322/612)
#1 comv です 大きな勘違いをしていたようですねスミマセン 以下のようなことでしょうか? A B C D E 1 acbadcbba 2 935841621 3 4 a b c d 5 1 式 → → → 6 2 ↓ 7 3 8 4 9 5 10 6 11 7 12 8 13 9 A1に記号入力 a~d A2に対する値を入力 A5:A13に1~9を記載 B4:E4に a~dを記載 B5に式 =TEXT(MAX(IF(LEN($A$1)>=ROW($A$1:$A$30),IF((MID($A$1,ROW($A$1:$A$30),1)=B$4)*(MID($A$2,ROW($A$1:$A$50),1)*1=$A5),$A5))),"#") と入力後 [Ctrl]+[Shift]を押したまま[Enter]で確定 B5:E13の範囲に複写
お礼
何度もありがとう御座います。
- imogasi
- ベストアンサー率27% (4737/17069)
A-iと言う範囲(9番目)までなら、小文字英字として Private Sub Worksheet_Change(ByVal Target As Range) s = "" For i = 1 To Len(Target) s = s & Trim(Str(Asc(Mid(Target, i, 1)) - 96)) Next i MsgBox s End Sub で良いでしょう。 sを好きなセルにセットすること。 何に使うか想像できないが。
- inte-nori
- ベストアンサー率48% (33/68)
VBAで作ってみたんですが、これでいいでしょうか? 1行目のセルにa~dを、その下の2行目にそれに対応する値を入力するとします。 1.「ツール」>「マクロ」>「Visual Basic Editor」を開きます。 2.左上のほうの「ThisWorkbook」というところで右クリックをして、「コードの表示」を選択します。 3.右側の大きな画面に下記のコードを入力します。(コピー&ペーストでいいはず。) Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) On Error GoTo er If Target.Offset(-1).Value = "a" Then Range("f10") = Target.Value If Target.Offset(-1).Value = "b" Then Range("g10") = Target.Value If Target.Offset(-1).Value = "c" Then Range("h10") = Target.Value If Target.Offset(-1).Value = "d" Then Range("i10") = Target.Value er: End Sub 4.下のタスクバーのボタンでエクセルの画面を表示してください。 これで、F10~I10のセルにそれぞれa~dの下に入力した値が表示されると思います。 上記のコードのRange("○○")の部分を修正することにより、別のセルに表示させることが可能です。
お礼
VBAの存在も知らなかったのですが、一応希望道りになりました。ただ、どう使えばよいのか良く分かりませんので、もっと勉強してみます。 ありがとう御座います。
- comv
- ベストアンサー率52% (322/612)
こんばんは >上記の例では、aは1 bは2 cは1 dは4 です。 で acbadcbba が 935841621 になる規則性が わからないのですが 単純に a=1 b=2 C=1 d=4 なら A1にa~dを入力 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"a",1),"b",2),"c",1),"d",4) 結果は acbadcbba なら 112141221 となります
お礼
詳しい説明ありがとう御座います。 やっと内容を理解する事が出来ました。 関数での方法が分からないのは残念でしたが、私の作りたいシートは出来上がりそうです。 本当にありがとう御座いました。