[[20040915220033]] 『文字数が一定でない値から1文字だけ抽出』(セニョますい) ページの最後に飛ぶ

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

 

『文字数が一定でない値から1文字だけ抽出』(セニョますい)

度々すみません。

 A1に「1234567」という数値があったとします。
 それをB1のセルに「\」を表示し、B2〜B8のセルに、それぞれ1,2,3,4,5,6,7と抽出したいのです。
 で、A1の値が「123456」となった場合、B1空白にし、B2に「\」を表示し、B3〜B8に1,2,3...と表示させたいのです。

 出来ますでしょうか?

 桁数は最大7桁と考えていいのかな?

 考え方の方向性としては、
「桁数が足りないなら足りるように補完すればよい」

 RIGHT(REPT(" ", 8) & "\" & A1,8)

 こうすればA1が何桁であろうが必ず円マーク付きで8桁返って来る。
あとはMID関数を使うなりして1文字ずつ分解すればよい。
(近所で時々見かけるPG)

 すみません、質問の仕方が悪かったようで。。。
 具体的には、給与明細なんです。
 仕切りなおしさせて下さい。(最初の質問は忘れて下さい。)

 A1にはその人の給与が入ってます。(仮に1,234,567円だとします。)

 A2 B2 C2 D2 E2 F2 G2 H2 
 \  1  2  3  4  5  6  7 

 給与明細の為、1桁1マス(セル)で上記のように抽出したいのです。

 さらに、A1が987,654円だった場合、

 A2   B2 C2 D2 E2 F2 G2 H2 
 空白  \  9  8  7  6  5  4  

 となるようにしたいのです。
 給与なので、最大は7桁ですが(そんなに貰ってる人いませんが。。)、6桁、5桁の場合もあります。
 時には0円の場合(諸経費とか)もあり、その場合は完全にその行は空白にしたいです。
 1桁目(H2)には、

 =IF(A1=0,"",RIGHT(A1))

 で問題なく、

 2桁目(G2)には、

 =IF(OR(H2="\",H2=""),"",IF((LEN(A1)-1)=0,"\",MID(A1,LEN(A1)-1,1)))

 と、こんな感じでやってみて、一応は機能してますが、如何とも不恰好な気がしますし、F2にコピー
 する際も、LEN(A1)-1 部分の-1を-2に置換してやらなければなりません。

 諦めた方がよいですかね・・・
 (セニョますい)

 変化する数値は不規則ではない=決まった数だけ変化する
のだから、決まった数だけ変化する数値を利用します。
この場合は列方向に1ずつ変化すればよいわけですから、
COLUMN関数が利用できます。
 
=MID(REPT(" ",7-LEN($A$1))&"\"&$A$1,COLUMN(A1),1)
 
この式をA2へ入力してH2までフィルドラッグ。
COLUMN(A1)のA1は絶対参照にしないでね。
(KAMIYA)

 衝突。
KAMIYAさんとほぼ同様だが、
一応A1が0の場合、および空欄の場合は何も出さないようにしたもの。

 A2に
=IF(VALUE($A1)=0,"",MID(REPT(" ",7-LEN($A1))&"\"&$A1,COLUMN(A:A),1))
として、右方向へH2までフィルドラッグ。

 縦方向へのフィルドラッグを考慮し、行は固定せず。
COLUMNはなんとなく気分で列指定方式。
KAMIYAさんのREPTの使い方取り込ませてもらいました。
(近所で時々見かけるPG)

 あー、桁数がA1の値が7桁を越えた場合にREPT関数でエラーになるか…

 =IF(VALUE($A1)=0,"",MID(RIGHT(REPT(" ",8)&"\"&$A1,8),COLUMN(A:A),1))

 エラーは避けたいのがプログラマのサガ(笑)なのでやはりこれで…
尚、REPTで8文字繰り返すのはRIGHTで8文字取る事と同期を取りたかった為、ただそれのみ。
(近所で時々見かけるPG)

 A1が文字列だったらエラーになる…

 =IF(ISNUMBER($A1),MID(RIGHT(REPT(" ",8)&"\"&$A1,8),COLUMN(A:A),1),"")

 これで。
 ちなみに(セニョますい)さんの最初の質問で意図は伝わってますよ。
 (近所で時々見かけるPG)

 =IF(AND($A$1<>"",LEN($A$1)+(COLUMN(I1)-COLUMN($H$1))>0),MID(TEXT($A$1,"\###0"),LEN($A$1)+(COLUMN(I1)-COLUMN($H$1)),1),"")
こんな感じでどうでしょう?v(=∩_∩=)v
(夏目雅子似)

 >桁数がA1の値が7桁を越えた場合に
想定はできるが、考えたくない。
私がやるとこんなカンジかな?
=IF((LEN($A1)<8)*$A1,MID(REPT(" ",7-LEN($A1))&"\"&$A1,COLUMN(A1),1),"")
(近所で時々見かけるPG)さんのは数値入力が前提なら、
=IF($A1,MID(RIGHT(REPT(" ",8)&"\"&$A1,8),COLUMN(A:A),1),"")
これでもいけそうですが。
 
数式側でエラー処理まで考えるのはいやなので、
私なら入力規則である程度入力値を制限してしまうところですね。
(KAMIYA)


 とりあえず自分の式を最終修正…
数値0の場合を忘れ去っていたのでやり直し。
 =IF(ISNUMBER($A1),IF($A1<>0,MID(RIGHT(REPT(" ",8)&"\"&$A1,8),COLUMN(A:A),1),""),"")

 以下雑談

 (KAMIYA)さん
当然、ユーザーに「数値7桁で入力してね」が前提で良いでしょうね。
私の「もし7桁以上来たら?」は個人的な後付け仕様です。

 >(近所で時々見かけるPG)さんのは数値入力が前提なら、
文字が来た時を嫌ってISNUMBERに切り替えました。
(結果、数値0の時の考慮を忘れ去ってしまいました…^^;為、最終追加。)

 VALUEワークシート関数についてちょっと誤解してました。
VBのVal関数と同じような物だと思ってましたが、違ったのですね。
Excel特有の関数については、私もここで勉強している次第です。

 >=IF($A1,MID(RIGHT(REPT(" ",8)&"\"&$A1,8),COLUMN(A:A),1),"")
 >これでもいけそうですが。
数値前提なら確かに。
IFは数値0ならFALSE、0以外はTRUEと判断するという仕様を
十分に把握されているからこそ書ける式ですね。

 ちなみに文中の(笑)は「そんな事考えなくて良いじゃん私(笑)」という自嘲の物です。
もし気に触ったのなら失礼しました。

 (夏目雅子似)さん
式については、こっちではうまく動作しなかったです。どういう想定だろう?
それとは全然関係ないですが、TEXTワークシート関数があることをこれで知りました。
Format関数が無いなぁ無いなぁと探してた所です。

 (セニョますい)さん
回答以外のことで長々と埋めてしまって失礼しました。
どうも私には文章を取り留めも無く長々と書く悪い癖があるようで…

 以上、この辺で。
 (近所で時々見かけるPG)

 おはようございます。
すみません。私の式はI1に貼り付けて左にコピーしてみてください。m(._.)m ペコッ
=IF(AND($A1,LEN($A1)+(COLUMN(A1)-7)>0),MID(TEXT($A1,"\###0"),LEN($A1)+(COLUMN(A1)-7),1),"")
それから、みなさんゼロに対応してらっしゃるので、私もKAMIYAさんのをパックって
修正しました。v(=∩_∩=)v
(夏目雅子似)

 左にコピーってのもおかしいので直接数字を入れる方式に修正しました。m(._.)m ペコッ
近所で時々見かけるPGさんへ
検証ありがとうございます。自分のミスにはなかなか気づかないものです。
ありがとうございました。v(=∩_∩=)v
とかなんとか言いながら、、今度は、あってるかなぁ????(^^;; ヒヤアセ
(夏目雅子似)

 (近所で時々見かけるPG)さん、
気に触るなんてトンでもありません。処理の肌理細やかさに舌を巻くばかりデス。
エラーに対する姿勢は「さすがプログラマ」。
私の文章が紋切り型でよくなかったと反省しております。
ちなみに「想定はできるが、考えたくない。」とは、
「高給取り」に対しての僻みでありマス(^_^;)
 
(夏目雅子似)さん、
「左にコピー」は気がつかなかった・・・・。
(KAMIYA)


 Σ(゚∀゚;) エッ!?
 こ、こんなにお返事が!
 皆さん、本当に有難う御座います。
 通常業務が片付いてから、改めて試させて頂きます<(_ _)>

 >ちなみに(セニョますい)さんの最初の質問で意図は伝わってますよ。

 (近所で時々見かけるPG)さん、慰め有難う御座います。
 ただ、最初の質問で、B2〜B8だの、列方向にしちゃってたんですよね(^^)A;
 本当は行方向だと後で気付いたので、仕切りなおしさせてもらいました。
 (皆さん、それに沿った関数を提示して下さりますので^^)
 それに、回答以外で埋めて下さっても全然OKです!
 私も似たようなタチなので。
 (セニョますい)

 皆様お世話になりました。
 KAMIYAさんの式を使わせて頂き、無事できた事をご報告・・・と思ったのですが、式自体は
 問題なかったのですが、「\」で表示されるべき所が、\(←の半角)で表示されてしまいます。
 ・・・と、何が悪かったのか分かりませんが、別のセルの書式コピペしたら直りました。
 自己解決レスすみません。
 セルの書式設定いくらいじっても「\」で表示できなかったのが腑に落ちないのですが。。。

 ともあれ、やりたい事が完成しました!
 改めて皆様、有難うございました!
 (セニョますい)

 むむっ、やはりでましたか?
実は私のとこも出たんです。
半角バックスラッシュは日本語環境では出そうとしても
なかなか出せるものではないので・・・
半角バックスラッシュは\とコードが同一なので、
何かの弾みでそのようになるのかもしれません。
その後再現できなかったので、「なかったこと」にしてましたが・・・。
どういうことなんでしょう?
(KAMIYA)

 と、書いた矢先に再現できてしまいました。
たとえば、
=MID(REPT(" ",7-LEN($A$1))&"\"&$A$1,COLUMN(A1),1)
この式をボードからそのままコピーして
数式バーではなく、セルへ直接貼り付けすると
半角バックスラッシュになりますね。
IEの表示フォントが影響するようです。
(IEのフォント設定によるかもしれませんが・・・)
(KAMIYA)

 IE等からの文字コピーは書式も一緒にコピーしますから、それのせいですね、きっと。
例えば上の「エクセルの学校」っていう太字のタイトルをコピーしてExcelのセルに貼り付けると
太字の情報はもとより、Tableタグ情報まで忠実に貼り付けられるし、
果ては「ライブラリ」をコピーしてセルに貼り付けるとリンク情報までいっしょに貼り付ける、
という塩梅。頭が良いというか余計なお世話というか…
避けたい場合は貼り付けるセル上で右クリック→形式を指定して貼り付け
で任意の形式で貼り付けると回避可能。
(ご近所PG)

 KAMIYAさん、ご近所PGさん、単純にここに記述のある「\」をコピーしてエクセルにそのまま  
 貼り付けただけで再現できました!
 フォントを見ると、「Arial Unicode MS」になってました。
 なので、フォントを変えるだけでちゃんと\表示に直せました。
 ・・・もう一回同じことやってみたら、今度は半角バックスラッシュになりません。。。
 なんで〜??
 取りあえず、ご近所PGさんの通り形式指定貼り付けで回避するとして、もしボケて直貼りして
 半角バックスラッシュになちゃったら、今後はフォントを確認します!

 最後の最後まで有難うございました。
 (セニョますい)

コメント返信:

[ 一覧(最新更新順) ]


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