• ベストアンサー

VBA 数(可変)分だけ順に記号を並べる方法

エクセルVBAを勉強し始めたばかりの超初心者です。 以下のような表を作成したいのですが、良い方法が思いつきません。 どうか御教授の程お願いいたします。 ●記号(A~Eとして)の数(可変)分だけ列の上から順にその記号を入力する。  例えばA:1,B:0,C:3,D:5,E:2ずつある場合、列Cに縦に"ACCCDDDDDEE" という感じです。 表現が分かりづらいかもしれませんが宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

>エクセルVBAを勉強し始めたばかりの超初心者です。 超初心者(謙遜でなければ)がいきなりこんな面倒なもの、 (とは言っても慣れれば簡単ですが)をしてもあまり勉強にならないような気がします。 それよりも、Workbook,Sheet,Rangeオブジェクトの関係、For~ Next セルの書式設定などもっと基本的なことから学ぶべきではないかと。。。   で、本題。 セルA1に A:1,B:0,C:3,D:5,E:2 があり これをC列の一行目から質問のように展開する場合。 '----------------------------------------------- Sub Test()  Dim myStr  Dim S  Dim K As Integer  Dim N As Integer  Columns("C:C").ClearContents  myStr = Split(Range("A1").Value, ",")  For K = LBound(myStr) To UBound(myStr)    S = Split(myStr(K), ":")    If S(1) > 0 Then      For N = 1 To S(1)        Cells(Rows.Count, "C").End(xlUp).Offset(1).Value = S(0)      Next N    End If  Next K  Range("C1").Delete xlShiftUp End Sub '------------------------------------------------- エラーチェックは入れてありません。 分からないコマンドはちゃんとヘルプを参照すること。 また、変数名は適当につけてありますが、通常はその変数が 何を表わしているか分かるような名前にしなければいけません。 以上。    

yuhyihyan
質問者

お礼

大変丁寧にご回答くださいましてありがとうございました! 質問文が分かりづらかったと思いますが、「数(可変)分だけ列の上から順にその記号を入力する」という点について知りたかったものでしたから、とても助かりました。 勉強させていただきました!

その他の回答 (3)

noname#140971
noname#140971
回答No.3

[イミディエイト] ? CutStr("A:1,B:0,C:3,D:5,E:2", ",", 1) A:1 ? CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 1), ":", 1) A ? CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 1), ":", 2) 1 ? String(CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 1), ":", 2), CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 1), ":", 1)) A ? String(CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 2), ":", 2), CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 2), ":", 1)) ? String(CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 3), ":", 2), CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 3), ":", 1)) CCC ? String(CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 4), ":", 2), CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 4), ":", 1)) DDDDD ? String(CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 5), ":", 2), CutStr(CutStr("A:1,B:0,C:3,D:5,E:2", ",", 5), ":", 1)) EE このテストで判るように区切り子で区切られた文字列を分割して取り出す関数 CutStr() の類を自作すれば簡単に。 なお、CutStr()では Split を利用しています。

yuhyihyan
質問者

お礼

ご回答ありがとうございました。 私の質問の仕方が悪く、知りたかった内容とは異なりましたが、 文字列から数値と文字を切り分けるという方法を教えていただきました。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

どのようにしたら『A:1,B:0,C:3,D:5,E:2』を『ACCCDDDDDEE』に置き換えることが可能か考えて見ましょう 『A:1,B:0,C:3,D:5,E:2』は『文字』『:』『数字』の組み合わせが『,』で区切られています ならば 1 文字列から文字を探す関数 2 文字列の所定の位置から切り出す関数 の2つのを使えば出来そうです 切り出された文字列を見てみると『文字』『:』『数字』となっているので『:』の前と後ろを切り出せばよさそうです 切り出した 文字を数字分繰り返す関数を探すか 自前で作成しましょう エクセルの表の操作は Rangeオブジェクトや Cell関数で シートのセルにアクセス出来ますよ 関連する関数などは InStr, Mid, Split, For Each などでしょう

yuhyihyan
質問者

お礼

ご回答ありがとうございました。 私の質問の仕方が悪く、申し訳ございませんでした。 ”数(可変)分だけ列の上から順にその記号を入力する”という点について知りたかったものですから…。 しかし、文字の切り出すという考え方があるということを教えていただきました。 大変勉強になりました。 ありがとうございました。

  • gab_snow
  • ベストアンサー率30% (3/10)
回答No.1

こんばんは >数(可変)分 とはどう入力させるのでしょう? 入力された(されている)数値分Forで回してみてはどうでしょう? private function hanpuku(byval 入力値 as long, _               byval 反復させる文字 as string)as string  dim buff as String  dim i as Integer  For i = 1 to 入力値   buff = buff + 反復させる文字  Next  hanpuku = buff end function #エディタも使ってないのでコンパイルエラーがでてもご愛嬌ということで… みたいな感じで 質問文からは入力の指定がされていないためこれぐらいしか回答できません。 もろに研修or課題っぽい内容なので周りの方に聞いたほうが早いかと思います。

yuhyihyan
質問者

お礼

ご回答ありがとうございました。 私の質問の仕方が悪く、申し訳ありませんでした。

関連するQ&A