質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

解決済

1回答

13592閲覧

VBAのリストボックス内で複数行のうちの一つだけを左寄せ(右寄せ)にする

kolobokkule

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

0グッド

1クリップ

投稿2019/02/19 11:23

実現したいこと

Excel VBAにて、複数行のリストボックスを作成しています。
まず、以下のような関数を作成し、fmTextAlignLeftとfmTextAlignRightそれぞれの設定におけるリストボックスで、特定の行のみを逆向きの文字寄せにできることを目指しました。
Space(n)で空白を追加することで、文字寄せできるという仕組みです。

Public Function FormatAddSpace(ByVal strName As String, _
ByVal intMojiCount As Integer, _
Optional ByVal isTop As Boolean = True) As String
'行頭もしくは末尾にスペースを挿入する関数
'引数strName:対象となる文字列
'引数intMojiCount:スペース挿入後の全体の文字数
'引数isTop:先頭から処理する(True)か、末尾から(False)か(省略したら、先頭から)
Dim n As Integer
n = intMojiCount - Len(strName) 'スペースの挿入数
If isTop = True Then '省略しているので先頭から(True)
strName = Space(n) & strName
Else
strName = strName & Space(n) & "|"
End If
FormatAddSpace = strName
End Function

関数はたとえば以下の4行目のように呼び出します。
〇〇.Textは当然ですが文字列です。

With LstBox1 .AddItem 0 .List(.ListCount - 1, 1) = cboGoodsID.Text .List(.ListCount - 1, 2) = FormatAddSpace(txtGoodsName.Text, 30, False) .List(.ListCount - 1, 3) = Format(txtGoodsPrice.Text, "#,##0") .List(.ListCount - 1, 4) = Format(txtQuantity.Text, "#,##0") .List(.ListCount - 1, 5) = txtGoodsUnit.Text .List(.ListCount - 1, 6) = txtAmount.Text .List(.ListCount - 1, 7) = txtTax.Text .List(.ListCount - 1, 8) = txtSumWithTax.Text End With

しかしどうにも右寄せ、左寄せがリストボックスに反映されません。
ローカルウィンドウで値を確認してみても、思いどおりの値にはなっています。
なぜか、リストボックス上でのみ、空白がなくなってしまうようです。
エラーは発生しておりません。

原因、対処法等あれば教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2019/02/20 10:05

「複数行のうちの一つ」とタイトルに記載されていますが、処理を見る限り「複数列のうちの一つ」のようです。どちらが正しいのでしょうか?(私の手元では複数列のうちの一つに対して右寄せできています)
kolobokkule

2019/02/20 10:30

申し訳ありません。複数列の間違いでした。 なるほど、できていますか…
guest

回答1

0

ベストアンサー

数字だと次の様なやり方で解決できるそうです。

Format([数値フィールド], "@@@@@@@")
@は必要な文字数入れてもらえればOKです。

参考:http://www.ruriplus.com/msaccess/faq/faq_028.html

投稿2019/02/20 05:56

SuperTarokun

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kolobokkule

2019/02/20 10:45

回答ありがとうございます。 この場合ですと、@の数を対応する列それぞれについて一つ一つ設定するしかないでしょうか?
SuperTarokun

2019/02/20 10:48

おっしゃる通りです。 .List(.ListCount - 1, 6) = Format(txtAmount.Text,"@@@@@@@@")'8桁 .List(.ListCount - 1, 7) = Format(txtTax.Text,"@@@@@@") ' 6桁 .List(.ListCount - 1, 8) = Format(txtSumWithTax.Text,"@@@@@@@@")'8桁 こんなイメージですかね
kolobokkule

2019/02/20 23:46

例まで示していただきありがとうございます。 .List(.ListCount - 1, 4) = FormatAddSpace(Format(Cells(i, 5).Value, "#,##0"), 10) 実はこういった処理をしようとしていた場所もあり、FormatAddSpace関数(質問内容にある自作関数)を作成していたのですが、Cellの値によって空白の数を変更する必要があります。今回教えていただいたものを、空白の数を柔軟に変化させる繰り返し処理にすることはできるでしょうか。
SuperTarokun

2019/02/21 08:27 編集

自分が提示した方法ですと、桁数が文字数より上回れば文字数によって空白を追加する必要は無いはずですがListboxは左寄せになっている必要があります。 @の個数が桁数になるので、たとえば  @@@@@ だとすると   りんご    なし  えだまめ ぱいなっぷる といった風に、文字が足りない部分が空白になります。 ぱいなっぷるは文字数がオーバーするため、ずれが生じます。 また、フォントがMS PゴシックやMS UI GOTHICといったプロポーショナルフォントだと巾が文字によって変わるのでずれが生じます。 MS ゴシックやMS 明朝など、幅が固定のものを使いましょう。 提示された目標を実現するためには下記の様になります。 .List(.ListCount - 1, 4) = Format(Format(cells(i,5).value, "#,##0"), "@@@@@@@@@@") '右寄せ10桁 追伸 やろうとしていたスペースを追加する方法はやり方として間違っていないと思います。 Space(n)の中身がわからないので、なぜスペースが表示されなかったのかはちょっとわからないですね・・・
kolobokkule

2019/02/23 03:08

回答ありがとうございます。 このやり方でやっていこうと思います。 Space(n)ですが、デバッグで空白を入れた変数の中身を確認すると、ちゃんと空白は入っています。("りんご         "のような形で) なぜかリストボックスにだけ反映されないのです・・・もうしばらく考えてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問