rowsourceを使用せずに
ユザーフォーム上でリストボックス1に表示される
シート1のB列 D列 E列を
桁区切り表示したいんですが
アドバイスお願いします
ComboBox1.AddItem Sheet1.Cells(適当なRow, 適当なColumn)
ってこと?
そうですが
B列 D列 E列を
列一杯で設定したいんです
下記のコードを使用してですが
[B65536].End(xlUp)
又。
下記のコードは、A1 A2を桁表示したんですが
LOOPを利用してできませんか?
A列を桁区切りにですが。
Private Sub UserForm_Initialize()
ListBox1.AddItem Format(Sheets(1).Range("A1").Value, "#,#0")
ListBox1.AddItem Format(Sheets(1).Range("A2").Value, "#,#0")
End Sub
すいません
何とか作成したんですが
以下の2つのコードを組み合わせること、できますでしょうか
Private Sub UserForm_Initialize()
Dim myTmp As Variant
Dim i As Long, j As Long
myTmp = Sheets("仕訳帳").Range("a1"). _
CurrentRegion.Value
For i = 6 To 11
For j = 1 To UBound(myTmp)
myTmp(j, i) = Format(myTmp(j, i), "#,##0")
Next
Next
Me.ListBox4.List = myTmp
End Sub
Private Sub Refresh_List()
Dim r1 As Long
Dim r2 As Long
r1 = 2
With Sheets("仕訳帳")
r2 = .[B65536].End(xlUp).Row
If r2 > 15 Then r1 = r2 - 14
ListBox4.List = .Range( _
.Cells(r1, 1), .Cells(r2, 1)).Resize(, 15).Value
End With
End Sub
むりですか
関数名から想像できる意図を実現して組み合わせるのは
無駄が多くてやる気しないです。
過去ログでボクがたまに紹介してる配列にデータを一括で
読み込むサンプルを見つけたなら、読み込んだ配列をグローバル
変数に保持するなり、引数で上のコードで言う UserForm_Initialize
に渡すなりしてやればできるね。
もし、過去ログに載せてるサンプルを利用してるなら、ちゃんと
理解して、もう少しレスする気の起こるコードを書いて欲しいです。
なんか過去ログの説明から始めないと理解してもらえそうに
無いと…思っちゃうと…レスを打つ手が止まっちゃいます(TT)
わかりました
改めて説明します
ユ−ザーフォームのテキストボックスからシート1に以下のように表示します
(月 日 借方科目 借方金額 貸方科目 貸方金額 摘要)
A B C D E F G
1 12 1 当座預金 1,111 現金 1,111 預入
2 12 2 給料手当 654 現金 654 支払
3 12 3 雑費 1,543 現金 1,543 交通費
4 12 4 租税公課 123 現金 123 印紙代
5 12 5 普通預金 1,756 当座預金 1,765 預入
上記5行目を記入すると、以下のようにリストボックスに表示されます
2 12 2 給料手当 654 現金 654 支払
3 12 3 雑費 1,543 現金 1,543 交通費
4 12 4 租税公課 123 現金 123 印紙代
5 12 5 普通預金 1,756 当座預金 1,765 預入
つまり、一行づつスライドしてリストボックスに表示するように設定したのが
下記のコードです。
Private Sub Refresh_List()
Dim r1 As Long
Dim r2 As Long
r1 = 2
With Sheets("シート1")
r2 = .[B65536].End(xlUp).Row
If r2 > 15 Then r1 = r2 - 14
ListBox4.List = .Range( _
.Cells(r1, 1), .Cells(r2, 1)).Resize(, 15).Value
End With
End Sub
この表示では、リストボックスに桁表示されません。
これで悩んでいます。
桁表示するコードは、以下のとおりです
Private Sub UserForm_Initialize()
Dim myTmp As Variant
Dim i As Long, j As Long
myTmp = Sheets("シート1").Range("a1"). _
CurrentRegion.Value
For i = 6 To 11(この部分は仮です)
For j = 1 To UBound(myTmp)
myTmp(j, i) = Format(myTmp(j, i), "#,##0")
Next
Next
Me.ListBox4.List = myTmp
End Sub
このコードでは、どっちつかずになり、上記2つのコードが
うまくかみあいません。
そのため合体することはできないかと、
なやんでいるわけです。
この説明でわかりますでしょうか。
上記2つの関数では対象としているデータが違いますよね?
合体すると言っても何を合体できるか?を良く考えましょう。
関数全体の機能を見ると全く違う処理と言ってもいいです。
違う処理を合体するのは難しい…というか例え同じ関数内に
入れたとしても、結局コードレベルで2つ書く事になり、意味が
ありません。しかし、同じ機能を持つ処理であれば共通化できます。
そういった場合、関数化します。例えば UBound(myTmp)
と書けば引数として渡した配列の取りうる最大値を返して
くれます。引数を変えれば使い回しができます。この場合の
UBound のような関数を自分で作るのです。
そのために、2つの関数内での処理をもっと細かく、箇条書きに
してみましょう。
>Refresh_List
・シート1を対象とする(With Sheets("シート1"))
・表示対象となる行数を計算する(r1 = 2,r2 = .[B65536].End(xlUp).Row,If r2 > 15 Then r1 = r2 - 14)
・表示対象となる Range を計算する( .Range(.Cells(r1, 1), .Cells(r2, 1)).Resize(, 15))
・Range.Value でシート上のデータを取る( = .Range(.Cells(r1, 1), .Cells(r2, 1)).Resize(, 15).Value)
・ListBox4.List にデータを設定する(ListBox4.List = )
>UserForm_Initialize
・シート1を対象とする(Sheets("シート1").)
・表示対象となる Range を計算する(.Range("a1").CurrentRegion.)
・Range.Value でシート上のデータを取る(myTmp = Sheets("シート1").Range("a1").CurrentRegion.Value)
・桁表示する(myTmp(j, i) = Format(myTmp(j, i), "#,##0"))
・ListBox4.List にデータを設定する(ListBox4.List = myTmp)
見比べて Refresh_List に桁表示する機能が必要なのだから
>>Refresh_List
>・シート1を対象とする
>・表示対象となる行数を計算する
>・表示対象となる Range を計算する
>・Range.Value でシート上のデータを取る
・桁表示する
>・ListBox4.List にデータを設定する
このままコードに戻しても取りあえずの要求は満たせそうです。
しかし、更にコードをスッキリさせるには同じ機能(単語)を
関数化します。
>・シート1を対象とする
つねにシート1が対象ならグローバルな変数にシート1を
セットしておいても良いですね。関数化するほどの処理は
ありません。
>・表示対象となる Range を計算する
Range が既に関数のような機能を持ってるので特に関数化
が必要な部分はありません。
>Range.Value でシート上のデータを取る
過去ログの Excel 関係のコードを色々調べたりはして
いただけましたでしょうか?例えば過去ログ検索『Resize』
で引っ掛かる[VB6.0]のコード
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200408/04080085.txt
では Rows と Cols を引数に Variant() を返す関数を
作ってます。Range を引数に Variant() を返す関数を
作っても良いかもしれませんね。
>・桁表示する
繰り返し特定の行(シート1のB列 D列 E列など)を桁表示
するなら Variant() を引数に Format した Variant() を
返す関数を作ってみてはどうでしょう。
>・ListBox4.List にデータを設定する
上の関数の戻り値を設定するのみです。
ボクなら以上のような手順でプログラミングを設計します。
特攻隊長まるるう さん
有難うございます
具体的です
時間ください
後日報告します
特攻隊長まるるう さん
あなたの説明は高度すぎて
わたしの頭では
無理なようです
え"?(^^;)
ボクの説明はMIYAMAさんのコードを日本語にしただけで、
[プログラミング言語]→[日本語]の和訳しかしてません。
コードと日本語はほぼ1:1対応となってますので、
そのまま[日本語]→[プログラミング言語]の訳ができれば
終了です。しかもMIYAMAさんのコードをそのまま利用して
ますのでレベルはMIYAMAさんご自身のレベルと同じと
いう事になりますです。
…ご自分で書かれたコードが高度すぎるという事ですか???
MIYAMAさんのコードをコピーして入れ替える程度で
回答になってしまいますが…コードの提示が必要ですか?
特攻隊長まるるう さん
おっしゃる通りです
色々な、HPに掲載してある
コードで作成したものです
キチッと理解しきれていません
お願いできたらと思います
久々に釣り人発見って感じがするのは俺だけかもしれないので、これは駄レスだ。
>色々な、HPに掲載してある
>コードで作成したものです
>キチッと理解しきれていません
『プログラム』という言葉を辞書で引くと『予定を立てる』
という意味があります。理解できないコードを貼り付けると
いう行為は、その動きを全く予想できてないわけですから、
プログラミングとは言えないと思います。このようなことを
書く人がプログラマを目指すはずは無いですが、もしプログラマ
やSEなどを目指しているなら、向いてません。やめた方が
賢明です。
もし目指してないとして、…プログラムを組む事自体向いて
ません。予想もつかないコードを書き、予想もつかない影響を
与え、予想もつかない迷惑な存在となります。仕事上どうしても
請け負わないといけない場合もあるでしょう。でも自分で
プログラムするのはやめましょう。お金を出してプログラマを
雇って下さい。貴方がプログラムするのは危険です。
…それに、何故コードと1:1対応の和訳をしたか?というと
キチッと理解してもらう為だったんですが…あれで理解できない
なら、やっぱり向いてません。説明のレベルはかなり初心者
向けに落としてありましたから。
また、
>あなたの説明は高度すぎて
>わたしの頭では
>無理なようです
自分のことは棚に上げて『自分は悪くない。説明する方が高度な
説明をするのが悪いのだ』と平気で書ける方のようです。
ボクの一番嫌いな、関わりたくないタイプですね。
早く縁を切りたいので動くソースコードあげます。
[Excel VBA]
Private mTargetSheet As Excel.Worksheet
Private Const mTargetSheetName As String = "仕訳帳"
Private Sub CommandButton1_Click()
Call Refresh_List
End Sub
Private Sub UserForm_Initialize()
If Not SetTargetSheet Then
Exit Sub
End If
Me.ListBox4.List = _
GetFormatObject(mTargetSheet.Range("$A$1").CurrentRegion.Value)
End Sub
Private Function SetTargetSheet() As Boolean
On Error GoTo ErrorMsg
Set mTargetSheet = Sheets(mTargetSheetName)
SetTargetSheet = True
Exit Function
ErrorMsg:
MsgBox mTargetSheetName & " シートが見つかりません。" _
& vbCrLf & "Sheet1 をセットします。", vbOKOnly, "対象シート設定"
Set mTargetSheet = Sheets(1)
SetTargetSheet = False
End Function
Private Sub Refresh_List()
Dim r1 As Long, r2 As Long
r1 = 2
With mTargetSheet
r2 = .[$B$65536].End(xlUp).Row
If r2 > 15 Then r1 = r2 - 14
Me.ListBox4.List = _
GetFormatObject(.Range(.Cells(r1, 1), .Cells(r2, 1)).Resize(, 15).Value)
End With
End Sub
Private Function GetFormatObject(ByRef ObjectArray As Variant) As Variant
For i = 1 To UBound(ObjectArray, 2) '(この部分は仮です)
Select Case i
Case 2, 4, 5 'B,E,D列
For j = 1 To UBound(ObjectArray, 1)
ObjectArray(j, i) = Format(ObjectArray(j, i), "#,##0")
Next
End Select
Next
GetFormatObject = ObjectArray
End Function
温情感謝します
これ以上、この掲示板には お願いしませんから
お世話になりました
コードの結果を報告しておきます
新しいリストから15行表示
はできませんでした
書かれたソースコードをどのように批評しようとそれは構わないけど、
人格を否定してはいけないな、こんな短いやり取りで、その人がどのような
人かなんて分からないのだから。
自分がやさしいと思っている事が、他人にとってやさしいと思ってはいけないな、
他人がやさしいと思っている事が、自分にとって難しいかも知れないから。
自分の説明が相手に分からない時は、相手の努力が足りないと思ってはいけないな、
自分の説明の仕方が悪いかも知れないのだから。
「特攻隊長まるるう」さん良い人だけど、時々ちょっと厳しいな、それをしっている人は
受け流すけど、初めての人は傷つくかも知れないな。
平和主義者 さん
そういう考えではないですよ
説明不足であったかもしれません
特攻隊長まるるう さんが
そう思われたんであれば、不徳の致すところです。
問題は私が軽率に、この掲示板に質問したことかもしれません
バカなんです 私は!
皆さんに不愉快な思いをさせたについて
謝罪します!
もうすこし勉強してから投稿したいと思います
この掲示板は
専門用語で言われますので
52歳の私にとって、難しかったです。
それでは
なるほど、なるほど。年齢の開示までして頂きお手数をお掛けしました。
あまり甘い回答ばかり付けてますと、箸にも棒にも掛からないような
使えないプログラマが育ってしまいます。基礎ができてない質問者
に対しては冷たい仕打ちをしております。…それが最善なのかは本人も
色々と思うところはありますが、度を越せばハッキリと発言される方が
多いサイトですので、こちらが叩かれますw。気を付けつつもこの
スタンスを続けていきたいと思っております。
最後まで冷静な対応、ありがとうございました。不快に感じてる
というより『やれやれ、またか』といった感覚でした。同じような
書き込みをされる方は掃いて捨てるほどいらっしゃいます。2日も
経てば記憶にも残ってませんので、ボクの気分を心配する必要は
無いですよ。MIYAMAさん自身の事を考えて頂ければいいです。もう
二度と回答を付けて欲しくないと思ったら、他にもいくらでも似た
ような掲示板はありますし、ここでも『まるるうは回答付けるな』
と書いて頂ければそのスレッドには解答付けませんしw。実力が
まだ付かないままで再び質問していただいても構いませんし(また
斬る可能性はありますが…)さて…
・どこかで拾ったソースコードを理解もせずに張り付けている。
・初歩的な知識を身に付けていない。
・バカなので私にはできません。
・ソースコード下さい。
…という風な書き込みに見えたんですが…間違ってますか?
もしMIYAMAさんが10代の若者であれば、何のためにここで質問
してるの?自分で解決する気ないの?そもそもプログラムする気
無いんじゃないの?…聞きたくなります。
年齢的なことを考慮に入れ、なるほど困難なことに挑戦されている
とも思いました。しかし、逆に自分がどの程度の実力をもって
いるかの判断で『バカ』だと仰られた。ある程度分かっていらっ
しゃるようですが、今の状態から入門書に載ってる初級プログラム
が理解・コーディングできるようになるまでの壁は厚いですよ。
失礼ながら一人のプログラムを行う人材として評価させて
頂きますと『プログラムをしない方がいい』レベルです。
残念ながらこの評価は依然として変わりません。
プログラムに関してバカな事は問題では無いでしょう。人間には
得手不得手がありますし、いわゆる天才でも基準にすればこの程度の
回答しかできないボクは比較にならないほどバカです。それなら
それで自分の戦える土俵で勝負すればよいのです。逆に同じ土俵に
あがるなら立って組み合えるだけの実力は求められます。別に
プログラムに限った事ではないと思いますが?。
MIYAMAさんの場合、最初から自分でコーディングが無理だと
判断すれば、プログラマを雇う選択肢もあったのでは?それなり
の社会経験があれば誰かから何かを貰う、知識を分けてもらう
のがそれほどお安くはない事もお分かりでしょう。それでもなお
自分でコーディングしたいなら、蹴られてもしがみついて1行づつ
理解するしかありません。
お好きなようにどうぞ。ただ、言い訳は聞きたくありません。
足りない実力を補う知識は提供します。しかし、プログラミングが
自分でできないならそれは質問ではなく仕事の依頼です。お金を
払って買ってください。
はっきり申し上げて、「特攻隊長まるるう 」さんは熱心だし、レスも面白く私は好きです。
この前提の上で少しだけ反論を。
>基礎ができてない質問者に対しては冷たい仕打ちをしております
ここは初心者掲示板です、基礎が出来ている人のことを初心者と言いますか?
>年齢的なことを考慮に入れ、なるほど困難なことに挑戦されているとも思いました
失礼この上も無い、今や年齢や性別で人を区別してはいけないのは、グローバルスタンダードです、
どのような環境で仕事をなされているか知りませんが、その様な考えでは世界の中で戦えません。
ソフトウエアーをやっていられる割には頭が固いのではないでしょうか。
50歳以上で新しいことに挑戦している人は私の会社にはごそごそいます。
>失礼ながら一人のプログラムを行う人材として評価させて
>頂きますと『プログラムをしない方がいい』レベルです。
そんな決定的なことがどうして短いやり取りだけで判断できるのですか。
こんなのを「カリカルチャリズム」と言います。その人にレッテルをぺたんと貼り付けて、
単純化した上で、その人でなく貼り付けたレッテルを批判します。
最後に、私は「特攻隊長まるるう」さんが好きなので、書かせていただきました。
これだけ書かせていただいて、私はROMります。
こんなレス上にageるなって(orz
…とか言いつつも俺もageてるレス(ororz
ツイート | ![]() |