過去ログ

                                Page     851
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼長いマクロを省略したい  maeda 03/3/6(木) 16:20
   ┗Re:長いマクロを省略したい  ichinose 03/3/6(木) 17:58
      ┗Re:長いマクロを省略したい  maeda 03/3/6(木) 20:47
         ┗Re:長いマクロを省略したい  ichinose 03/3/7(金) 1:31
            ┗Re:長いマクロを省略したい  maeda 03/3/7(金) 22:21

 ───────────────────────────────────────
 ■題名 : 長いマクロを省略したい
 ■名前 : maeda <fwhn0621@mb.infoweb.ne.jp>
 ■日付 : 03/3/6(木) 16:20
 -------------------------------------------------------------------------
   ユーザーフォームにテキストボックス等を95個配置し、各テキストボックス等にオブジェクト名を「氏名」「住所」などと設定しました。
テキストボックスの値を次のようにしてワークシートに記述したいのですがテキストボックスが多い為変数処理が出来ないか考えてますが
上手くいきません、いい方法はないでしょうか。

Worksheets("個人Data").Cells(touroku + 1, 1).Value = 氏名


'オブジェクトの名称を変数へ登録
  For i = 1 To 95
    aitem(i) = Worksheets("Rist").Cells(i, 11)
  Next

オブジェクトを変数処理したい。
  ' For i = 1 To 43
    Worksheets("個人Data").Cells(touroku + 1, 1).Value = aitem(i)
  'Next
この方法だと変数に読み込んだデータ自体が記述されてしまう。
 ───────────────────────────────────────  ■題名 : Re:長いマクロを省略したい  ■名前 : ichinose  ■日付 : 03/3/6(木) 17:58  -------------------------------------------------------------------------
   ▼maeda さん:
こんにちは。
>ユーザーフォームにテキストボックス等を95個配置し、各テキストボックス等にオブジェクト名を「氏名」「住所」などと設定しました。
>テキストボックスの値を次のようにしてワークシートに記述したいのですがテキストボックスが多い為変数処理が出来ないか考えてますが
>上手くいきません、いい方法はないでしょうか。
ユーザーフォームにテキストボックスを4っつ配置します(オブジェクト名は何でもかまいません)。さらにコマンドボタンを一つ配置します。
テキストボックスのオブジェクト名は、Worksheets(1)のセルA1からA4に予め入ってます。
コマンドボタンがクリックされた時の処理は、Worksheets(2)のセルA1から下にテキストボックスの内容を移します。
と言うようなmaeda さんの考えられた手法を取ると・・・、
'====================================================
Sub test() '標準モジュール
  UserForm1.Show
End Sub

以下、当該ユーザーフォームモジュール
'====================================================
Dim text(1 To 4) As MSForms.TextBox 'テキストボックスの配列変数
'====================================================
Private Sub UserForm_Initialize()
'配列変数に実際のテキストボックスをセット
  For i = 1 To 4
   Set text(i) = Controls(Worksheets(1).Cells(i, 1).Value)
   Next
End Sub
'===========================================================
Private Sub CommandButton1_Click()
'転記処理
  For i = 1 To 4
   Worksheets(2).Cells(i, 1).Value = text(i).text
   Next
End Sub

こんな方法ではいかがですか?
 ───────────────────────────────────────  ■題名 : Re:長いマクロを省略したい  ■名前 : maeda <fwhn0621@mb.infoweb.ne.jp>  ■日付 : 03/3/6(木) 20:47  -------------------------------------------------------------------------
   ▼ichinose さん:
>
>以下、当該ユーザーフォームモジュール
>'====================================================
>Dim text(1 To 4) As MSForms.TextBox 'テキストボックスの配列変数
>'====================================================
>Private Sub UserForm_Initialize()
>'配列変数に実際のテキストボックスをセット
>  For i = 1 To 4
>   Set text(i) = Controls(Worksheets(1).Cells(i, 1).Value)
>   Next
>End Sub
>

この場合、どのテキストボックスが変数の何番目かは確認できるのでしょうか?
転記処理を実行して確認しか方法はありませんか?
『Controls(Worksheets(1).Cells(i, 1).Value)』はワークシートになっておりますが
ユーザフォームの場合も設定しなくてはいけないのでしょうか?

詳しい知識が不足しており、お尋ねですみません。
 ───────────────────────────────────────  ■題名 : Re:長いマクロを省略したい  ■名前 : ichinose  ■日付 : 03/3/7(金) 1:31  -------------------------------------------------------------------------
   ▼maeda さん:
こんばんは。
ちょっと、変更しました。
記述したコードは、
ユーザーフォームにテキストボックス4っつ(名前を仮に 氏名、住所1、住所2、電話番号 にしてみました。何でもいいんですが説明の都合上、はっきりさせました)とコマンドボタンを一つ配置(これは前回と一緒です)します。
テキストボックス名のWorksheets(1)へのセットもコード上で行いました。
コマンドボタン(クリック)の処理は、前回同様、「テキスト内容をWorksheets(2)のセルA1から下に書き込む」です。

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

当該ユーザーフォームに
'===================================================
'====================================================
Dim text() As MSForms.TextBox 'テキストボックスの配列変数
Dim txt_cnt As Long      'テキストボックスの数
'====================================================
Private Sub UserForm_Initialize()
  Call テキストボックス名を指定したシートに保管(Worksheets(1))
'配列変数に実際のテキストボックスをセット
  For i = 1 To txt_cnt
   ReDim Preserve text(1 To i)
   Set text(i) = Controls(Worksheets(1).Cells(i, 2).Value)
   Next
  With Worksheets(1)
   .Range(.Cells(1, 1), .Cells(txt_cnt, 2)).ClearContents '一端移したデータの消去
   End With
End Sub
'===========================================================
Private Sub CommandButton1_Click()
'転記処理
  For i = 1 To txt_cnt
   Worksheets(2).Cells(i, 1).Value = text(i).text
   Next
End Sub
'=============================================================
Sub テキストボックス名を指定したシートに保管(wsht As Worksheet)
'in  : wsht テキストボックス情報を書き込むシートオブジェクト
'out : txt_cnt テキストボックスの数
  Dim ctrl As MSForms.Control
  txt_cnt = 0
  With wsht
   For Each ctrl In Controls
    If TypeName(ctrl) = "TextBox" Then
      .Cells(txt_cnt + 1, 1).Value = ctrl.TabIndex
      .Cells(txt_cnt + 1, 2).Value = ctrl.Name
      txt_cnt = txt_cnt + 1
      End If
    Next
   If txt_cnt > 0 Then
'    Tabindexプロパティでソート
     .activate
     .Range(.Cells(1, 1), .Cells(txt_cnt, 2)).Sort _
      Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
      :=xlPinYin
     End If
   End With
End Sub

上記のように例題を変更しました。
>この場合、どのテキストボックスが変数の何番目かは確認できるのでしょうか?
>転記処理を実行して確認しか方法はありませんか?

上のコードでは
例えば、「氏名」という名前のテキストボックスは、
text(氏名.tabindex+1) で変数(配列)から取得できますし、
 text(controls("氏名").tabindex+1) でも取得できます。

例2 「住所1」のテキストボックスの場合は、同様に
text(住所1.tabindex+1)  または、
  text(controls("住所1").tabindex+1)
となりますが、こういうことですか?


>『Controls(Worksheets(1).Cells(i, 1).Value)』はワークシートになっておりますが
>ユーザフォームの場合も設定しなくてはいけないのでしょうか?
↑これの意味がわからないのですが・・・。
以上の内容はユーザーフォームのコントロールを対象としていますよ。
 ───────────────────────────────────────  ■題名 : Re:長いマクロを省略したい  ■名前 : maeda <fwhn0621@mb.infoweb.ne.jp>  ■日付 : 03/3/7(金) 22:21  -------------------------------------------------------------------------
   ▼ichinose さん:


いろいろ試しましたが上手く行かず、とりあえず同じような記述を繰り返しました。

時間が出来次第よく勉強します、ありがとうございます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 851