過去ログ

                                Page     242
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼行にある項目名を探して左から何列目かを取得  とも 02/10/15(火) 22:16
   ┗Re:行にある項目名を探して左から何列目かを取得  Nakamura 02/10/15(火) 23:20
      ┗Re:行にある項目名を探して左から何列目かを取得  とも 02/10/16(水) 13:44
         ┗Re:行にある項目名を探して左から何列目かを取得  Nakamura 02/10/16(水) 23:29
            ┣できましたっ  とも 02/10/17(木) 14:23
            ┗できましたっ2.  とも 02/10/17(木) 22:28
               ┗Re:できましたっ2.  Nakamura 02/10/18(金) 1:30
                  ┗Re:できましたっ2.  とも 02/10/21(月) 13:00
                     ┗Re:できましたっ2.  Nakamura 02/10/21(月) 22:35
                        ┗とっても助かりました  とも 02/10/22(火) 19:10

 ───────────────────────────────────────
 ■題名 : 行にある項目名を探して左から何列目かを取得
 ■名前 : とも
 ■日付 : 02/10/15(火) 22:16
 -------------------------------------------------------------------------
   はじめまして

いつも見させていただいています。
私もちょっと教えていただきたく投稿しました。

シートの第1行目に項目名があります。(10項目)
フォームに項目名と同じ名前のTextBoxが10あります。

あるTextBoxに数値を入力すると、そのTextBoxと同じ名前の
項目名の列に、入力した数値を転記したいのです。
Offsetなるものを使うと、シートの項目名の順番を変えることが
できません。
項目名の順番は、たまに変更されます。
A列の左端(A1)は名前が30くらい並んでます。

Offsetを使わずにTextBoxの数値を転記することは可能でしょうか?
どなたか教えて下さい。
 ───────────────────────────────────────  ■題名 : Re:行にある項目名を探して左から何列目かを取得  ■名前 : Nakamura  ■日付 : 02/10/15(火) 23:20  -------------------------------------------------------------------------
   ▼とも さん:
>はじめまして
>
>いつも見させていただいています。
>私もちょっと教えていただきたく投稿しました。
>
>シートの第1行目に項目名があります。(10項目)
>フォームに項目名と同じ名前のTextBoxが10あります。
>
>あるTextBoxに数値を入力すると、そのTextBoxと同じ名前の
>項目名の列に、入力した数値を転記したいのです。
>Offsetなるものを使うと、シートの項目名の順番を変えることが
>できません。
>項目名の順番は、たまに変更されます。
>A列の左端(A1)は名前が30くらい並んでます。
>
>Offsetを使わずにTextBoxの数値を転記することは可能でしょうか?
>どなたか教えて下さい。

こんばんは
質問があります。
セルに転記するタイミングは?
転記先は対象列の最終行それとも決まった行ですか?
それでは
 ───────────────────────────────────────  ■題名 : Re:行にある項目名を探して左から何列目かを取得  ■名前 : とも  ■日付 : 02/10/16(水) 13:44  -------------------------------------------------------------------------
   ▼Nakamura さん:
こんにちは。

情報不足ですみませんでした。以下の通りです。

>セルに転記するタイミングは?
TextBoxへ数値を入力し(10項目)、コマンドボタンをクリックした時です。

>転記先は対象列の最終行それとも決まった行ですか?

A1の列は氏名ですので、基本的には決まった行ということになります。
つまり、Aさんであれば、AさんをシートからTextBoxに呼び出します。
そのAさんの10項目の数値を入力するというものです。
氏名は重複なしです。

宜しくお願い致します。
 ───────────────────────────────────────  ■題名 : Re:行にある項目名を探して左から何列目かを取得  ■名前 : Nakamura  ■日付 : 02/10/16(水) 23:29  -------------------------------------------------------------------------
   こんばんは
ご免なさいまだ良く分かりません。

シートレイアウトはこう言う感じですか?

  A     B   C   D   E   F  ・・・
1 氏名   英語  国語  数学  理科  社会 ・・・
2 田中   80  50  60  70  90 ・・・
3 佐藤   55  90  80  60  75 ・・・
4 太田   99  80  95  100 90 ・・・
5 ・    ・   ・   ・   ・   ・  ・・・
・ ・
・ ・
・ ・

このレイアウトにしても、行(氏名)をどの様に得るか?です。

>AさんをシートからTextBoxに呼び出します。

とありますが、このコードは出来ているのでしょうか?
Aさんと言う名前もテキストボックスに入っているとし、そのテキストボックスの
オブジェクト名を”氏名”としてコードを書きます。

Private Sub CommandButton1_Click()
  
  Dim nrg As Range, rg As Range
  Dim Ctl As MSForms.Control

  With ActiveSheet
  
    Set nrg = .Columns(1).Find(氏名.Text, , xlValues, xlWhole)
 
    If nrg Is Nothing Then Exit Sub
  
    For Each Ctl In Me.Controls
  
      If TypeOf Ctl Is MSForms.TextBox Then
  
        Set rg = .Range("A1", Range("A1").End(xlToRight).Address) _
                    .Find(Ctl.Name, , xlValues, xlWhole)
      
          If Not rg Is Nothing And rg.Value <> "氏名" Then
      
            .Cells(nrg.Row, rg.Column).Value = Ctl.Value
        
          End If
      
      End If
        
    Next
    
  End With
  
  Set nrg = Nothing
  Set rg = Nothing
          
End Sub

ともさんにとって当然な事でも、私にとっては必ずしも
そうではありませんので、想像で書くしかありません。
シートやユーザーフォームのレイアウトを書くなど、
出来るだけ詳しく書く事が、解決の早道です。

それでは
 ───────────────────────────────────────  ■題名 : できましたっ  ■名前 : とも  ■日付 : 02/10/17(木) 14:23  -------------------------------------------------------------------------
   ▼Nakamura さん:
こんにちは

説明不足 すみませんでした。
シートレイアウトはNakamuraさんの書かれた通りです。

>シートレイアウトはこう言う感じですか?
>
>  A     B   C   D   E   F  ・・・
>1 氏名   英語  国語  数学  理科  社会 ・・・
>2 田中   80  50  60  70  90 ・・・
>3 佐藤   55  90  80  60  75 ・・・
>4 太田   99  80  95  100 90 ・・・
>5 ・    ・   ・   ・   ・   ・  ・・・
>・ ・
>・ ・
>・ ・
>このレイアウトにしても、行(氏名)をどの様に得るか?です。

名前及び各項目の既存データの取得は以下の通りです。

Private Sub 氏名_Exit(ByVal Cancel As MSForms.ReturnBoolean)

  Dim St As String
  Dim Fi As Range
  
   St = 氏名.Value
  
  With ActiveSheet
    Set Fi = .Range(.Cells(1, 1), .Cells(50, 1)).Find(St)
    Fi.Activate
    Cells(ActiveCell.Row, 1).Select
    氏名.Value = ActiveCell.Value
    英語.Value = ActiveCell.Offset(0, 1).Value
    国語.Value = ActiveCell.Offset(0, 2).Value
    数学.Value = ActiveCell.Offset(0, 3).Value
    理科.Value = ActiveCell.Offset(0, 4).Value
    社会.Value = ActiveCell.Offset(0, 5).Value
          
  End With
  
  Set Fi = Nothing

End Sub
'======================================
Private Sub 変更_Click()

With ActiveSheet
   
If 氏名.Value = ActiveCell.Value Then

ActiveCell.Offset(0, 1) = 英語.Text
ActiveCell.Offset(0, 2) = 国語.Text
ActiveCell.Offset(0, 3) = 数学.Text
ActiveCell.Offset(0, 4) = 理科.Text
ActiveCell.Offset(0, 5) = 社会.Text


    ActiveCell.Offset(1).Select
    
    If ActiveCell.Value = "" Then
    ActiveCell.Offset(-1).Select

    Else
    氏名.Value = ActiveCell.Value
    英語.Value = ActiveCell.Offset(0, 1).Value
    国語.Value = ActiveCell.Offset(0, 2).Value
    数学.Value = ActiveCell.Offset(0, 3).Value
    理科.Value = ActiveCell.Offset(0, 4).Value
    社会.Value = ActiveCell.Offset(0, 5).Value
    End If
End If
End With
End Sub

これで、シートのデータを各TextBoxにもってきています。
このユーザーフォーム内に データ変更ボタン(コマンドボタン)を作成し、
各データを変更し、同ボタンによりシートのデータを変更します。
(.Textで)

現状は上述のようなのですが、これだとシートの項目順が固定されていなければ
なりません。事情により、この順番が変わってしまうのです。

Nakamuraさんのコードを追加しました。
できました。できました。
シートの項目順を入れ替えてもちゃんと表示されましたし、変更もできました。
いったいどうなっているのかコードの意味がわかりませんが、
とにかくできました。
ありがとうございました。

すみません。もうひとつ教えてください。
私の以前のコードですと、名前とデータを書くBoxに引張ってくるときに
Offsetを使っています。
これも、Offsetを使わない方法をお願いします。(何度もすみません)

それと、記述の最後にある「Next」は、項目名が無くなるところまで Next されるのでしょうか?
 ───────────────────────────────────────  ■題名 : できましたっ2.  ■名前 : とも  ■日付 : 02/10/17(木) 22:28  -------------------------------------------------------------------------
   ▼Nakamura さん:

こんばんは

先に投稿しました第2の質問であるTextBoxのデータを更新して
コマンドボタンをクリックするとシートのデータが変更される
方法について、

Ctl.Value = .Cells(nrg.Row, rg.Column).Value を
.Cells(nrg.Row, rg.Column).Value = Ctl.Text に書き換えたら
できました。

そこで、しつこく第3の質問なのですが、
上記の書き換えるコマンドボタンをクリックすると
書き換えとともに、次のデータを表示させたいのですが、
シートにあるデータを表示させる(Nakamuraさんに教わった)
コードを書き換えのコードに続けて書き込んでみたのですが、
そこから次の氏名のデータに移すために どこをいじってよいのか分かりません。
何卒宜しくお願い致します。

Private Sub 変更_Click()

Dim nrg As Range, rg As Range
Dim Ctl As MSForms.Control

With ActiveSheet
  Set nrg = .Columns(1).Find(氏名.Text, , xlValues, xlWhole)
  If nrg Is Nothing Then Exit Sub
  For Each Ctl In Me.Controls
   If TypeOf Ctl Is MSForms.TextBox Then
   Set rg = .Range("A1", Range("A1").End(xlToRight).Address) _
   .Find(Ctl.Name, , xlValues, xlWhole)
  If Not rg Is Nothing And rg.Value <> "氏名" Then
   .Cells(nrg.Row, rg.Column).Value = Ctl.Text
  End If
  End If
 Next
    
End With

  Set nrg = Nothing
  Set rg = Nothing

End Sub
 ───────────────────────────────────────  ■題名 : Re:できましたっ2.  ■名前 : Nakamura  ■日付 : 02/10/18(金) 1:30  -------------------------------------------------------------------------
   こんばんは

提案があります。
氏名テキストボックスを氏名コンボボックスに変更して、
以下のコードを貼り付けて実行してみて下さい。

Private Sub UserForm_Initialize()

  氏名.List = ActiveSheet.Range("A2", Range("A65536").End(xlUp).Address).Value
  氏名.Style = fmStyleDropDownList
  氏名.ListIndex = 0

End Sub

Private Sub 氏名_Change()

  Dim nrg As Range, rg As Range
  Dim Ctl As MSForms.Control

  With ActiveSheet
  
    Set nrg = .Columns(1).Find(氏名.Text, , xlValues, xlWhole)
  
    For Each Ctl In Me.Controls
  
      If TypeOf Ctl Is MSForms.TextBox Then
  
        Set rg = .Range("A1", Range("A1").End(xlToRight).Address) _
                    .Find(Ctl.Name, , xlValues, xlWhole)
      
          If Not rg Is Nothing Then
      
            Ctl.Value = .Cells(nrg.Row, rg.Column).Value
        
          End If
      
      End If
        
    Next Ctl
    
  End With
  
  Set nrg = Nothing
  Set rg = Nothing
  
End Sub

Private Sub 変更_Click()

  Dim nrg As Range, rg As Range
  Dim Ctl As MSForms.Control

  With ActiveSheet
  
    Set nrg = .Columns(1).Find(氏名.Text, , xlValues, xlWhole)
    '氏名コンボボックスのテキストで検索、ヒットすればnrgにそのRangeオブジェクトをセット
    For Each Ctl In Me.Controls
    'ユーザーフォーム上のコントロールをCtlにセットしながら、コントロール数分繰り返す。
  
      If TypeOf Ctl Is MSForms.TextBox Then  'コントロールの内テキストボックスかを判断
  
        Set rg = .Range("A1", Range("A1").End(xlToRight).Address) _
                    .Find(Ctl.Name, , xlValues, xlWhole)
        '項目行からテキストボックス(Ctl)の名前で検索、ヒットすればrgにそのRangeオブジェクトをセット
          If Not rg Is Nothing Then
          'ヒットしたら実行
      
            .Cells(nrg.Row, rg.Column).Value = Ctl.Value
        
          End If
      
      End If
        
    Next Ctl 'Ctlは省略してもかまいません。For Each に戻り、次のコントロールをCtlにセット
    
  End With
  
  Set nrg = Nothing
  Set rg = Nothing
  
  If 氏名.ListCount <> 氏名.ListIndex + 1 Then
  
    氏名.ListIndex = 氏名.ListIndex + 1
    
  Else
  
    氏名.ListIndex = 0
    
  End If

End Sub

なお、氏名コンボボックスは入力出来ない様になっています。
このフォームで、新規に氏名を登録して入力する場合は考えてみます。
それでは
 ───────────────────────────────────────  ■題名 : Re:できましたっ2.  ■名前 : とも  ■日付 : 02/10/21(月) 13:00  -------------------------------------------------------------------------
   ▼Nakamura さん:
こんにちは。

Nakamuraさんが せっかく提案してくださったのに
大変心苦しいのですが、(私の説明不足なのですが)
名前が100行以上あるのです。ドロップダウンリストだと
だ〜っと名前がでてきて、そこから指定するのはちょっと
使いづらいので、やはり氏名TextBoxに入力するやり方の
方がよいようです。
せっかくコードまで作成していただいたのにすみません。

もう少し 頑張ってみます。

ありがとうございました。
 ───────────────────────────────────────  ■題名 : Re:できましたっ2.  ■名前 : Nakamura  ■日付 : 02/10/21(月) 22:35  -------------------------------------------------------------------------
   こんばんは

出過ぎたマネを致しました。m(_ _)m
こんな感じで如何でしょうか?

Private Sub 氏名_Change()

  Dim nrg As Range, rg As Range
  Dim Ctl As MSForms.Control

  With ActiveSheet
  
    Set nrg = .Columns(1).Find(氏名.Text, , xlValues, xlWhole)
    
    If nrg Is Nothing Then Exit Sub
  
    For Each Ctl In Me.Controls
  
      If TypeOf Ctl Is MSForms.TextBox Then
  
        Set rg = .Range("A1", Range("A1").End(xlToRight).Address) _
                    .Find(Ctl.Name, , xlValues, xlWhole)
      
          If Not rg Is Nothing Then
      
            Ctl.Value = .Cells(nrg.Row, rg.Column).Value
        
          End If
      
      End If
        
    Next Ctl
    
  End With
  
  Set nrg = Nothing
  Set rg = Nothing
  
End Sub

Private Sub 変更_Click()

  Dim nrg As Range, rg As Range
  Dim Ctl As MSForms.Control

  With ActiveSheet
  
    Set nrg = .Columns(1).Find(氏名.Text, , xlValues, xlWhole)
 
    If nrg Is Nothing Then Exit Sub
 
    For Each Ctl In Me.Controls

      If TypeOf Ctl Is MSForms.TextBox Then
  
        Set rg = .Range("A1", Range("A1").End(xlToRight).Address) _
            .Find(Ctl.Name, , xlValues, xlWhole)
          
        If Not rg Is Nothing And rg.Value <> "氏名" Then

          .Cells(nrg.Row, rg.Column).Value = Ctl.Text
        
        End If
      
      End If
      
    Next
    
    氏名.Value = nrg.Offset(1).Value
  
  End With

  Set nrg = Nothing
  Set rg = Nothing

End Sub

それでは
 ───────────────────────────────────────  ■題名 : とっても助かりました  ■名前 : とも  ■日付 : 02/10/22(火) 19:10  -------------------------------------------------------------------------
   ▼Nakamura さん:
こんばんは

すっごい 助かりました。
ついつい 頼ってしまいます。

ありがとうございました。
Very Good でした。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 242