Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11958 / 13646 ツリー ←次へ | 前へ→

【12970】Columnプロパティについて kz 04/4/20(火) 16:41 質問
【13016】Re:Columnプロパティについて ichinose 04/4/21(水) 13:24 発言
【13037】Re:Columnプロパティについて kz 04/4/21(水) 17:26 質問
【13038】Re:Columnプロパティについて ichinose 04/4/21(水) 18:09 発言
【13046】Re:Columnプロパティについて kz 04/4/21(水) 21:09 質問
【13071】Re:Columnプロパティについて kz 04/4/22(木) 12:54 質問
【13085】Re:Columnプロパティについて ichinose 04/4/22(木) 18:28 発言
【13093】Re:Columnプロパティについて kz 04/4/23(金) 8:14 お礼

【12970】Columnプロパティについて
質問  kz  - 04/4/20(火) 16:41 -

引用なし
パスワード
     すみません。リストボックス(ColumnCount=4)にデータを表示させる際、2列目だけを左揃えにし、それ以外は右揃えにしたいと思ってます。後者はプロパティで設定可能ですが、前者はプロパティで設定ができなかったので、構文で処理させなくてはいけないかと思います。「マニュアル分リスト.Column(1, i - 始発行).textalign=fmtextalignleft」を入力し、実行するとオブジェクトが必要です、というエラーが出るのですが、この構文ではまずいのでしょうか?
どなたか、教えてください。宜しくお願い致します。


マニュアル分リスト.Column(0, i - 始発行) = .Cells(i, 1).Value
マニュアル分リスト.Column(1, i - 始発行) = .Cells(i, 2).Value
マニュアル分リスト.Column(2, i - 始発行) = Format(.Cells 
                          (i,3).Value, "#,##0")
マニュアル分リスト.Column(3, i - 始発行) = Format(.Cells                                  (i,4).Value, "#,##0")

【13016】Re:Columnプロパティについて
発言  ichinose  - 04/4/21(水) 13:24 -

引用なし
パスワード
   ▼kz さん:
こんにちは。

>   すみません。リストボックス(ColumnCount=4)にデータを表示させる際、2列目だけを左揃えにし、それ以外は右揃えにしたいと思ってます。後者はプロパティで設定可能ですが、前者はプロパティで設定ができなかったので、構文で処理させなくてはいけないかと思います。「マニュアル分リスト.Column(1, i - 始発行).textalign=fmtextalignleft」を入力し、実行するとオブジェクトが必要です、というエラーが出るのですが、この構文ではまずいのでしょうか?
>どなたか、教えてください。宜しくお願い致します。
>
>
>マニュアル分リスト.Column(0, i - 始発行) = .Cells(i, 1).Value
>マニュアル分リスト.Column(1, i - 始発行) = .Cells(i, 2).Value
>マニュアル分リスト.Column(2, i - 始発行) = Format(.Cells 
>                          (i,3).Value, "#,##0")
>マニュアル分リスト.Column(3, i - 始発行) = Format(.Cells                                  (i,4).Value, "#,##0")

textalignプロパティは、リストボックスのプロパティです。
右寄せ、左寄せの設定は、リストボックス全体にしか設定できないですね。

私は、上記のような列によって右寄せ、左寄せに分ける場合には、
設定(textalign)は、左寄せに設定しておいて、
右寄せしたい列のメンバには、計算で頭空白を追加しています。

よって、ColumnWidthsプロパティによって、各列の幅を設定したりすることも必要です。

だいたいの目安で列幅72ポイント(1インチ)で文字サイズの値の文字数が格納可能です(若干の微調整は必要、尚、フォントがMSゴシック、MS明朝の場合です)。

何回か試行錯誤すれば、規則がわかると思いますが・・・。

空白を先頭に埋めるのは、データが半角文字ならRsetステートメントでも
OKだと思いますが、漢字が入っていたりするとStrconv関数を用いての
計算が必要になります。

もっとも、私が上記のような事をするなら、リストボックスではなく、
Spreadsheetコントロールを使ってしまいますが・・・。

それからこのリストボックスって、シートに貼り付けたものですか?
それともユーザーフォームですか?

【13037】Re:Columnプロパティについて
質問  kz  - 04/4/21(水) 17:26 -

引用なし
パスワード
   ▼ichinose さん:
>▼kz さん:
>こんにちは。
>
>>   すみません。リストボックス(ColumnCount=4)にデータを表示させる際、2列目だけを左揃えにし、それ以外は右揃えにしたいと思ってます。後者はプロパティで設定可能ですが、前者はプロパティで設定ができなかったので、構文で処理させなくてはいけないかと思います。「マニュアル分リスト.Column(1, i - 始発行).textalign=fmtextalignleft」を入力し、実行するとオブジェクトが必要です、というエラーが出るのですが、この構文ではまずいのでしょうか?
>>どなたか、教えてください。宜しくお願い致します。
>>
>>
>>マニュアル分リスト.Column(0, i - 始発行) = .Cells(i, 1).Value
>>マニュアル分リスト.Column(1, i - 始発行) = .Cells(i, 2).Value
>>マニュアル分リスト.Column(2, i - 始発行) = Format(.Cells 
>>                          (i,3).Value, "#,##0")
>>マニュアル分リスト.Column(3, i - 始発行) = Format(.Cells                                  (i,4).Value, "#,##0")
>
>textalignプロパティは、リストボックスのプロパティです。
>右寄せ、左寄せの設定は、リストボックス全体にしか設定できないですね。
>
>私は、上記のような列によって右寄せ、左寄せに分ける場合には、
>設定(textalign)は、左寄せに設定しておいて、
>右寄せしたい列のメンバには、計算で頭空白を追加しています。
>
>よって、ColumnWidthsプロパティによって、各列の幅を設定したりすることも必要です。
>
>だいたいの目安で列幅72ポイント(1インチ)で文字サイズの値の文字数が格納可能です(若干の微調整は必要、尚、フォントがMSゴシック、MS明朝の場合です)。
>
>何回か試行錯誤すれば、規則がわかると思いますが・・・。
>
>空白を先頭に埋めるのは、データが半角文字ならRsetステートメントでも
>OKだと思いますが、漢字が入っていたりするとStrconv関数を用いての
>計算が必要になります。
>
>もっとも、私が上記のような事をするなら、リストボックスではなく、
>Spreadsheetコントロールを使ってしまいますが・・・。
>
>それからこのリストボックスって、シートに貼り付けたものですか?
>それともユーザーフォームですか?

▼ichinose さん,こんにちは。

質問に対する回答ですが、ユーザーフォームに張り付けて使用します。
ichinose さんからのご指摘を考えると、私が考えて作ったものは、
非効率なんでしょうか?Spreadsheetコントロールを使えば
複数列の表示も右寄せ左寄せも、簡単にできるのでしょうか?

【13038】Re:Columnプロパティについて
発言  ichinose  - 04/4/21(水) 18:09 -

引用なし
パスワード
   ▼kz さん:
こんにちは。

>>textalignプロパティは、リストボックスのプロパティです。
>>右寄せ、左寄せの設定は、リストボックス全体にしか設定できないですね。
>>
>>私は、上記のような列によって右寄せ、左寄せに分ける場合には、
>>設定(textalign)は、左寄せに設定しておいて、
>>右寄せしたい列のメンバには、計算で頭空白を追加しています。
>>
>>よって、ColumnWidthsプロパティによって、各列の幅を設定したりすることも必要です。
>>
>>だいたいの目安で列幅72ポイント(1インチ)で文字サイズの値の文字数が格納可能です(若干の微調整は必要、尚、フォントがMSゴシック、MS明朝の場合です)。
これフォントサイズが11のときでした。

>>
>>何回か試行錯誤すれば、規則がわかると思いますが・・・。
>>
>>空白を先頭に埋めるのは、データが半角文字ならRsetステートメントでも
>>OKだと思いますが、漢字が入っていたりするとStrconv関数を用いての
>>計算が必要になります。
>>
>>もっとも、私が上記のような事をするなら、リストボックスではなく、
>>Spreadsheetコントロールを使ってしまいますが・・・。
>>
>>それからこのリストボックスって、シートに貼り付けたものですか?
>>それともユーザーフォームですか?
>
>▼ichinose さん,こんにちは。
>
>質問に対する回答ですが、ユーザーフォームに張り付けて使用します。
>ichinose さんからのご指摘を考えると、私が考えて作ったものは、
>非効率なんでしょうか?Spreadsheetコントロールを使えば
>複数列の表示も右寄せ左寄せも、簡単にできるのでしょうか?

Spreadsheetコントロールは、Excelシートのイメージのコントロールです。
各列ごとの右寄せ・左寄せの設定は、手動操作で可能です。
イベントも本家シートより、多いですよ。
その他のコントロールを探してみて下さい。
確か本家(MS社)のサイトでもダウンロードできたと思いましたが・・。
今、考えてみたら、私はリストボックスって業務では使った事なかった・・。


取りあえず、リストボックスでのサンプルも作ってみました。
ユーザーフォーム(Userform1)にリストボックス(Listbox1)のみ貼り付けて
以下のコードを実行して下さい。

まず、標準モジュールにリストボックスのメンバ作成プロシジャー
アクティブシートのセルA1〜D10にデータをセットします。

'======================================================================
Sub Sample_data()
  With Range("a1:d10")
    For idx = 1 To .Rows.Count
     .Cells(idx, 1).Value = idx
     .Cells(idx, 2).Value = "サンプル" & idx
     .Cells(idx, 3).Value = "SAMP" & idx * 2
     .Cells(idx, 4).Value = idx * 3 + 3000
     Next
    End With
End Sub


次に本コードです。メンバデータがあるシートをアクティブにした状態でmainプロシジャーを実行してみて下さい。

標準モジュールに
'==================================================================
Sub main()
  UserForm1.Show
 
End Sub


ユーザーフォーム(Userform1)のモジュールに
'===================================================================
Private Sub UserForm_Initialize()
  Call リストボックスの設定
End Sub
'===================================================================
Sub リストボックスの設定()
  With ListBox1
   .ColumnCount = 4
   .Width = 352
   .Font.Name = "MS ゴシック"
   .Font.Size = 11
   .Clear
   .ColumnWidths = "85.1;85.1;85.1;85.1"
   Set rng = Range("a1:d10")
   ReDim myarray(rng.Rows.Count - 1, rng.Columns.Count - 1)
   For idx = 1 To rng.Rows.Count
     For jdx = 1 To rng.Columns.Count
      If jdx = 2 Then
        myarray(idx - 1, jdx - 1) = rng.Cells(idx, jdx).Value
      Else
        myarray(idx - 1, jdx - 1) = edit_rset(rng.Cells(idx, jdx).Value, 11)
        End If
      Next jdx
     Next idx
   .List() = myarray()
   End With
End Sub
'====================================================================
Function edit_rset(v_dat, spcnum) As Variant
  Dim wk
  wk = StrConv(v_dat, vbFromUnicode)
  If spcnum - LenB(wk) > 0 Then
   edit_rset = Space(spcnum - LenB(wk)) & v_dat
  Else
   edit_rset = v_dat
   End If
End Function


以上です。
リストボックスの2列目が左寄せ、後は、右寄せの表示がされるはずですが。
確認してみて下さい。

【13046】Re:Columnプロパティについて
質問  kz  - 04/4/21(水) 21:09 -

引用なし
パスワード
   ▼ichinose さん,こんばんは。
ご教示のとおり試してみましたら、出来ました!
ありがとうございました。
想像してたよりも結構複雑なんですね(><)
あとは、教えていただいた構文を元に、鋭意、努力させていただきます。
ちなみに、初歩的な質問で恐縮ですが、「jdx」や「idx」とは変数と
いうことでいいんですよね?

【13071】Re:Columnプロパティについて
質問  kz  - 04/4/22(木) 12:54 -

引用なし
パスワード
   >▼ichinose さん,こんにちは。

先日、教えていただいた内容を元に、自分で作ってみたら、見事、出来ました。
それで、4列目の値(数値)について、桁区切りを入れようと思い、色々
試行錯誤したのですが、どうやっても、桁区切りはできますが、左揃えになってしまいます。
以下の様な内容ではまずいのでしょうか?

Sub リストボックスの設定()
  With ListBox1
   .ColumnCount = 4
   .Width = 352
   .Font.Name = "MS ゴシック"
   .Font.Size = 11
   .Clear
   .ColumnWidths = "85.1;85.1;85.1;85.1"
   Set rng = Range("a1:d10")
   ReDim myarray(rng.Rows.Count - 1, rng.Columns.Count - 1)
   For idx = 1 To rng.Rows.Count
     For jdx = 1 To rng.Columns.Count
      If jdx = 2 Then
        myarray(idx - 1, jdx - 1) = rng.Cells(idx, jdx).Value
      Else
        myarray(idx - 1, jdx - 1) = edit_rset(rng.Cells(idx, jdx).Value, 11)
      End If

           ↓ここを追加しました。

      if myarray(idx-1,jdx-1)=format(rng.cells(idx,jdx).value,"#,##0")
      end if


     Next jdx
   Next idx
   .List() = myarray()
   End With
End Sub

【13085】Re:Columnプロパティについて
発言  ichinose  - 04/4/22(木) 18:28 -

引用なし
パスワード
   ▼kz さん:
こんにちは。
>
>先日、教えていただいた内容を元に、自分で作ってみたら、見事、出来ました。
>それで、4列目の値(数値)について、桁区切りを入れようと思い、色々
>試行錯誤したのですが、どうやっても、桁区切りはできますが、左揃えになってしまいます。
>以下の様な内容ではまずいのでしょうか?
まずいです・・・。

edit_rsetというFunctionプロシジャーを使って、半角11文字分(正確には11バイト、例題ではね)の文字列長に対して、指定された文字を見かけ右寄せになるように
頭に空白を埋めています。
よって、edit_rsetで編集後に再度

>if myarray(idx-1,jdx-1)=format(rng.cells(idx,jdx).value,"#,##0")
>      end if
(何だかわかりませんが、気持ちはわかります。)
これを入れてしまっては、編集した意味がなくなってしまいます。
以下のようにして下さい。


>
>Sub リストボックスの設定()
>  With ListBox1
>   .ColumnCount = 4
>   .Width = 352
>   .Font.Name = "MS ゴシック"
>   .Font.Size = 11
>   .Clear
>   .ColumnWidths = "85.1;85.1;85.1;85.1"
>   Set rng = Range("a1:d10")
>   ReDim myarray(rng.Rows.Count - 1, rng.Columns.Count - 1)
>   For idx = 1 To rng.Rows.Count
>     For jdx = 1 To rng.Columns.Count
>      If jdx = 2 Then
        myarray(idx - 1, jdx - 1) = trim(rng.Cells(idx, jdx).Value)
       Elseif jdx=4 then
        myarray(idx - 1, jdx - 1) = edit_rset(Trim(Format(rng.Cells(idx, jdx).Value, "#,##0")), 11)
      else
        myarray(idx - 1, jdx - 1) = edit_rset(Trim(rng.Cells(idx, jdx).Value), 11)
'今見たらTrim関数も入れておいたほうが無難だと思うので入れといて!!
>      End If
>
>           ↓ここを追加しました。
'      ↓追加は、削除してください
>
>      if myarray(idx-1,jdx-1)=format(rng.cells(idx,jdx).value,"#,##0")
>      end if
>
>
>     Next jdx
>   Next idx
>   .List() = myarray()
>   End With
>End Sub

確認してみて下さい。

【13093】Re:Columnプロパティについて
お礼  kz  - 04/4/23(金) 8:14 -

引用なし
パスワード
   ▼ichinose さん,おはようございます。
ご指摘どおり、試してみましたら、なんとかできました。
多少、数値のずれはありますが、仕方ないことですね。
色々、ありがとうございました。

11958 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free