Excel VBA質問箱 IV

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

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


9173 / 13644 ツリー ←次へ | 前へ→

【28813】教えてください。 tbtk 05/9/15(木) 10:56 質問[未読]
【28838】Re:教えてください。 Hirofumi 05/9/15(木) 22:06 回答[未読]
【28846】Re:教えてください。 tbtk 05/9/16(金) 8:49 お礼[未読]
【28848】Re:教えてください。 tbtk 05/9/16(金) 9:36 質問[未読]
【28871】Re:教えてください。 Hirofumi 05/9/16(金) 20:35 回答[未読]
【28943】Re:教えてください。 tbtk 05/9/19(月) 8:27 お礼[未読]

【28813】教えてください。
質問  tbtk  - 05/9/15(木) 10:56 -

引用なし
パスワード
   すみません、教えてほしいのですが
  A  B  C   D
1   車種 

2   車型
上記のものがシート1にありユーザーフォームの
テキストボックス1とテキストボックス2にデータを入力すると
  A  B  C   D
1   車種 TEXT1

2   車型 TEXT2
↓矢印

  A  B  C    D
1   車種 TEXT1 TEXT1

2   車型 TEXT2 TEXT2
という形で入力したデータが追加する形になっています。
これを今までに入力されたデータをまったく同じものがあったら
入力されないようにしたいのですがどうしたらよろしいのでしょうか?

車種は一緒の名前でも車型が違うという場合があります。
また、その逆で車型が一緒で車種が違うという場合もありますので
車種、車型が同一の時に入力されないという形にしたいです。

【28838】Re:教えてください。
回答  Hirofumi  - 05/9/15(木) 22:06 -

引用なし
パスワード
   UserFormの構造が解らないので?ですが
UserFormにTextBox1、TextBox2、CommandButton1が有るとして
CommandButton1で転記される物とします

UserFormのコードモジュールに以下を記述して下さい

Option Explicit

'Listの先頭セル位置(「車種」の行見出し位置)
Private rngList As Range
'Listの列数
Private lngEnd As Long

Private Sub CommandButton1_Click()

  If TextBox1.Text = "" Or TextBox2 = "" Then
    Exit Sub
  Else
    If DataExist Then
      Exit Sub
    End If
  End If
  
  'List列数を更新
  lngEnd = lngEnd + 1
  '車種、車型を書き込み
  With rngList
    .Offset(, lngEnd).Value = TextBox1.Text
    .Offset(1, lngEnd).Value = TextBox2.Text
  End With
  
  TextBox1.Text = ""
  TextBox2.Text = ""
  
End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

  With TextBox1
    If .Text <> "" Then
      If TextBox2.Text <> "" Then
        If DataExist Then
          Beep
          MsgBox "同名の車種、車型が有ります"
          Cancel = True
        End If
      End If
    End If
  End With
  
End Sub

Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

  With TextBox2
    If .Text <> "" Then
      If TextBox1.Text <> "" Then
        If DataExist Then
          Beep
          MsgBox "同名の車種、車型が有ります"
          Cancel = True
        End If
      End If
    End If
  End With
  
End Sub

Private Sub UserForm_Initialize()

  'Listの先頭セル位置設定
  Set rngList = ActiveSheet.Cells(1, "B")
  With rngList
    'Listの列数取得
    lngEnd = .Offset(, 256 - .Column).End(xlToLeft).Column - .Column
    If lngEnd <= 0 Then
      lngEnd = 0
    End If
  End With
  
End Sub

Private Sub UserForm_Terminate()

  Set rngList = Nothing
  
End Sub

Private Function DataExist() As Boolean

  Dim vntFound As Variant
  Dim rngScope As Range
  
  'List列数が0で無いなら
  If lngEnd > 0 Then
    '車種の範囲を取得
    Set rngScope = rngList.Offset(, 1).Resize(, lngEnd)
    '同名の車種が有るか探索
    vntFound = Application.Match(Trim(TextBox1.Text), rngScope, 0)
    '無いなら
    If IsError(vntFound) Then
      Exit Function
    Else
      '同名の車型が無い場合
      If rngList.Offset(1, vntFound).Value _
                  <> Trim(TextBox2.Text) Then
        Exit Function
      Else
        DataExist = True
      End If
    End If
    Set rngScope = Nothing
  Else
    Exit Function
  End If
  
End Function

【28846】Re:教えてください。
お礼  tbtk  - 05/9/16(金) 8:49 -

引用なし
パスワード
   Hirofumiさん。おはようございます。
コードの方、ありがとうございました。
早速試してみましたが問題ないようなので、もう少し自分なりにアレンジして
使っていこうと思います。
本当にありがとうございました。
またよろしくお願いします。 

【28848】Re:教えてください。
質問  tbtk  - 05/9/16(金) 9:36 -

引用なし
パスワード
   すいません、よく分からないのですが
試していたところ、同名の物でも入力されてしまうときが
あるのですが、なぜでしょうか?
私のほうでは車種にd、車型にddと入力したら既に入力してあるにも関わらず
もう一度入力できてしまいました。
色々、考えてみたのですがよく分かりません。
教えていただけると幸いです。

【28871】Re:教えてください。
回答  Hirofumi  - 05/9/16(金) 20:35 -

引用なし
パスワード
   ▼tbtk さん:
>すいません、よく分からないのですが
>試していたところ、同名の物でも入力されてしまうときが
>あるのですが、なぜでしょうか?
>私のほうでは車種にd、車型にddと入力したら既に入力してあるにも関わらず
>もう一度入力できてしまいました。
>色々、考えてみたのですがよく分かりません。
>教えていただけると幸いです。

ゴメン、私が勘違いでチョンボしました
プロシージャ「Private Function DataExist」の中を、
以下の様に差し替えて下さい

Private Function DataExist() As Boolean

  Dim i As Long
  Dim vntFound As Variant
  Dim vntText1 As Variant
  Dim vntText2 As Variant
  
  vntText1 = Trim(TextBox1.Text)
  vntText2 = Trim(TextBox2.Text)
  
  'List列数が0で無いなら
  If lngEnd > 0 Then
    '車種、車型の範囲を配列に取得
    vntFound = rngList.Offset(, 1).Resize(2, lngEnd)
    For i = 1 To lngEnd
      '同名の車種が有るか探索
      If StrComp(vntFound(1, i), _
            vntText1, vbTextCompare) = 0 Then
        '同名の車型が有るか探索
        If StrComp(vntFound(2, i), _
              vntText2, vbTextCompare) = 0 Then
          DataExist = True
          Exit For
        End If
      End If
    Next i
  End If
  
End Function

【28943】Re:教えてください。
お礼  tbtk  - 05/9/19(月) 8:27 -

引用なし
パスワード
   ありがとうございました!
希望の動きが出来るようになりました。
また、よろしくお願いします!

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