ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:yuhyihyan VBA 数(可変)分だけ順に記号を並べる方法
困り度:
  • 困っています
エクセルVBAを勉強し始めたばかりの超初心者です。
以下のような表を作成したいのですが、良い方法が思いつきません。
どうか御教授の程お願いいたします。

●記号(A〜Eとして)の数(可変)分だけ列の上から順にその記号を入力する。 
例えばA:1,B:0,C:3,D:5,E:2ずつある場合、列Cに縦に"ACCCDDDDDEE"
という感じです。

表現が分かりづらいかもしれませんが宜しくお願いします。
質問投稿日時:08/04/13 21:49
質問番号:3946677
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:onlyrom >エクセル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
'-------------------------------------------------

エラーチェックは入れてありません。
分からないコマンドはちゃんとヘルプを参照すること。
また、変数名は適当につけてありますが、通常はその変数が
何を表わしているか分かるような名前にしなければいけません。
以上。
 

 
種類:回答
どんな人:一般人
自信:自信あり
回答日時:08/04/14 16:54
回答番号:No.4
この回答へのお礼大変丁寧にご回答くださいましてありがとうございました!
質問文が分かりづらかったと思いますが、「数(可変)分だけ列の上から順にその記号を入力する」という点について知りたかったものでしたから、とても助かりました。
勉強させていただきました!

回答

 

回答者:Husky2007 [イミディエイト]
? 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 を利用しています。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/14 09:29
回答番号:No.3
この回答へのお礼ご回答ありがとうございました。
私の質問の仕方が悪く、知りたかった内容とは異なりましたが、
文字列から数値と文字を切り分けるという方法を教えていただきました。
ありがとうございました。

回答

 

回答者:redfox63 どのようにしたら『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 などでしょう
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:08/04/14 02:37
回答番号:No.2
この回答へのお礼ご回答ありがとうございました。
私の質問の仕方が悪く、申し訳ございませんでした。
”数(可変)分だけ列の上から順にその記号を入力する”という点について知りたかったものですから…。
しかし、文字の切り出すという考え方があるということを教えていただきました。
大変勉強になりました。
ありがとうございました。

回答

 

回答者:gab_snow こんばんは

>数(可変)分
とはどう入力させるのでしょう?
入力された(されている)数値分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課題っぽい内容なので周りの方に聞いたほうが早いかと思います。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/04/13 23:51
回答番号:No.1
この回答へのお礼ご回答ありがとうございました。
私の質問の仕方が悪く、申し訳ありませんでした。
最新から表示回答順に表示良回答のみ表示