Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8.1 : Excel 2016)
ユーザーフォームテキストボックスへ関数利用
投稿日時: 19/07/02 10:53:43
投稿者: 丘珠

DATAベース用のユーザーフォームに5個のテキストボックスを配置し、入力したデータをSheet1にA1,1から下記コードで転記しています。
Private Sub CommandButton1_Click()
With Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp)
  
.Offset(1, 0) = TextBox1.Value(日付入力 2019/7/3)
.Offset(1, 1) = TextBox2.Value(連番 1)
.Offset(1, 2) = TextBox3.Value
.Offset(1, 3) = TextBox4.Value
.Offset(1, 4) = TextBox5.Value
End With
End Sub
Sheet1のZに関数で=COUNTIF($A$2:A10,A10)(A列は日付入力)となりまります。Zは当日受付件数連番となります。下記イメージとなります
Sheet1 A列    Z列
    2019/7/2  1
    2019/7/2  2
    2019/7/3  1 〜
このSheet1Z列に関数で表示された当月受付連番数字をユーザーフォームのテキストボックスへ表示させたいのですが。
うまく説明できないのですがよろしくお願いいたします

回答
投稿日時: 19/07/02 11:41:23
投稿者: Suzu

引用:

Sheet1のZに関数で=COUNTIF($A$2:A10,A10)(A列は日付入力)となりまります。Zは当日受付件数連番となります。下記イメージとなります
Sheet1 A列    Z列
    2019/7/2  1
    2019/7/2  2
    2019/7/3  1 〜
このSheet1Z列に関数で表示された当月受付連番数字をユーザーフォームのテキストボックスへ表示させたい

 
 
入力の前に、今から入力しようとする 件 の 受付番号を 表示したいという認識で良いですか?
 
その場合、今から入力するのが、入力日 以外 のはあり得ないのですか?
 
あり得るのであれば、
・入力日を入力後
・レコード登録後
のどちらかで表示させる事になると思いますが
 
引用:
ユーザーフォームのテキストボックスへ表示させたい

具体的に、この内容の何が判らないのですか?

回答
投稿日時: 19/07/02 17:58:40
投稿者: WinArrow
投稿者のウェブサイトに移動

>Sheet1のZに関数で=COUNTIF($A$2:A10,A10)
 
この関数は、誰が何時入力するのでしょうか?
 
Z列の「値」を何時ユーザーフォームに表示させていのですか?
 

投稿日時: 19/07/03 10:54:14
投稿者: 丘珠

[quote="Suzu"]

引用:

Sheet1のZに関数で=COUNTIF($A$2:A10,A10)(A列は日付入力)となりまります。Zは当日受付件数連番となります。下記イメージとなります
Sheet1 A列    Z列
    2019/7/2  1
    2019/7/2  2
    2019/7/3  1 〜
このSheet1Z列に関数で表示された当月受付連番数字をユーザーフォームのテキストボックスへ表示させたい

 
 
入力の前に、今から入力しようとする 件 の 受付番号を 表示したいという認識で良いですか?
 
その場合、今から入力するのが、入力日 以外 のはあり得ないのですか?
 
あり得るのであれば、
・入力日を入力後
・レコード登録後
のどちらかで表示させる事になると思いますが
 
・入力日を入力後にユーザーフォームのテキストボックスへ表示させたいのですができますでしょうか
なかなか説明が難しくて申し訳ありません

回答
投稿日時: 19/07/03 14:50:12
投稿者: WinArrow
投稿者のウェブサイトに移動

>・入力日を入力後にユーザーフォームのテキストボックスへ表示させたいのですができますでしょうか
シートに登録したデータを使用して関数で求めているのだから、
・入力日を入力後に表示するのは、難しいというより、無理でしょう。
それができるくらいならば、Z列の関数は不要でしょう。
 
ところで
Z列セルの関数を誰が何時入力するのですか?
という質問しましたが、回答は?
 

回答
投稿日時: 19/07/03 15:22:36
投稿者: WinArrow
投稿者のウェブサイトに移動

関数入力に関する回答がありませんので
 
推測で
Private Sub CommandButton1_Click()
Dim RX As Long '@
Const SHIKI As String = "=COUNTIF($A$2:Axxx,Axxx)" 'A
 
    With Worksheets("Sheet1")
        With .Cells(.Rows.Count, "A").End(xlUp)
            .Offset(1, 0) = Me.TextBox1.Value '(日付入力 2019/7/3)
            .Offset(1, 1) = Me.TextBox2.Value '(連番 1)
            .Offset(1, 2) = Me.TextBox3.Value
            .Offset(1, 3) = Me.TextBox4.Value
            .Offset(1, 4) = Me.TextBox5.Value
            RX = .Row + 1 'B
        End With
        .Cells(RX, "Z").Formula = Replace(SHIKI, "xxx", RX) 'C
        Me.TextBox6.Text = .Cells(RX, "Z").Value 'D
    End With
End Sub
 
@〜Dは、追加したコードです。
 
※with句を2階建てにした方がわかりやすい
※ユーザーフォームのコントロールを取り扱う場合は、「Me.」で修飾する。
 

回答
投稿日時: 19/07/03 16:18:03
投稿者: Suzu

引用:
Sheet1 A列    Z列
    2019/7/2  1
    2019/7/2  2
    2019/7/3  1 〜
 
・入力日を入力後にユーザーフォームのテキストボックスへ表示させたいのですができますでしょうか

 
Z列の連番。。関数で良いのでしょうか?
行を削除したら、連番の値が変わりますよ。
 
行を削除しても 連番を変えたくないのであれば、
ワークシート上の式として保持してはいけません。「値」として持たせないと。
登録時に値として書き込む必要がある。
 
同じ日付のMAX値 +1 の値を
テキストボックスの更新後処理で取得すれば良いでしょう。
 
2016であれば、MAXIFS 関数が使えるので。。。
 
Private Sub TextBox1_AfterUpdate()
  If IsNull(TextBox1) = False Then
    If IsDate(TextBox1) = True Then
      Me.TextBox2 = _
       WorksheetFunction.MAXIFS( _
                Worksheets("Sheet1").Range("Z:Z"), _
                Worksheets("Sheet1").Range("A:A"), _
                CDate(Me.TextBox1) _
                                ) + 1
    End If
  End If
End Sub
 
※ 手元2016ではないので確認できません。

投稿日時: 19/07/04 11:42:15
投稿者: 丘珠

みなさん拙い説明でアドバイス有難うございます。
 WinArrowさんのコードで希望通りの表記ができました有難うございます。
これから、まだ同様のコードが必要となるため助かりました。