Excel (VBA)

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

 
(Windows 8.1 : Excel 2016)
アドバイスを
投稿日時: 19/07/05 14:11:35
投稿者: 丘珠

此方でアドバイスいただいた下記コードで1つの連番表示はできたのですが
後二つあり色々コードを試してみたのですがエラーとなってしまいますもう一度アドバイスをお願いします。
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
            .Offset(1, 5) = Me.TextBox6.Value
            .Offset(1, 6) = Me.TextBox7.Value
            .Offset(1, 7) = Me.TextBox8.Value
            .Offset(1, 8) = Me.TextBox9.Value
            .Offset(1, 9) = Me.TextBox10.Value
            .Offset(1, 10) = Me.TextBox11.Value
            .Offset(1, 11) = Me.TextBox12.Value
            .Offset(1, 12) = Me.TextBox13.Value
            .Offset(1, 13) = Me.TextBox14.Value
            .Offset(1, 14) = Me.TextBox15.Value
            .Offset(1, 15) = Me.TextBox16.Value
            .Offset(1, 16) = Me.TextBox17.Value
            .Offset(1, 17) = Me.TextBox18.Value
            .Offset(1, 18) = Me.TextBox19.Value
            .Offset(1, 19) = Me.TextBox20.Value
            .Offset(1, 20) = Me.TextBox21.Value
            .Offset(1, 21) = Me.TextBox22.Value
            .Offset(1, 22) = Me.TextBox23.Value '(日付入力 2019/7/3)
            .Offset(1, 23) = Me.TextBox24.Value '(連番 1)
            .Offset(1, 24) = Me.TextBox25.Value
            .Offset(1, 25) = Me.TextBox26.Value
            RX = .Row + 1 'B
        End With
        .Cells(RX, "AA").Formula = Replace(SHIKI, "xxx", RX) 'C
        Me.TextBox2.Text = .Cells(RX, "AA").Value 'D
    End With
End Sub
 
Sheet1(AB)には関数=TEXT(A16,"yymm") &TEXT(AA16,"000")、Sheet1(AC)には=IF(U16="","",COUNTIFS(U$2:U16,">"&EOMONTH(U16,-1),U$2:U16,"<="&U16))のコードで連番表示させておりますが上記コードと同じようにユーザーフォームのテキストボックス23にはABの関数結果をテキストボックス10にはACの関数結果を表示するようにしたいのですがよろしくアドバイスお願いします。

回答
投稿日時: 19/07/05 14:34:24
投稿者: WinArrow
投稿者のウェブサイトに移動

丘珠 さんの引用:

Sheet1(AB)には関数=TEXT(A16,"yymm") &TEXT(AA16,"000")、Sheet1(AC)には=IF(U16="","",COUNTIFS(U$2:U16,">"&EOMONTH(U16,-1),U$2:U16,"<="&U16))のコードで連番表示させておりますが上記コードと同じようにユーザーフォームのテキストボックス23にはABの関数結果をテキストボックス10にはACの関数結果を表示するようにしたいのですがよろしくアドバイスお願いします。

 
もう少し簡潔に書けませんか??
 
Dを参考に
○○ = ◆◆
のような形式で
左側は、受け取る側のテキストボックス名
右側は、セル番号
  
というような整理をすると
何をどうするのかが見えてくると思います。
 

回答
投稿日時: 19/07/05 14:43:59
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

            .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
             .Offset(1, 5) = Me.TextBox6.Value
             .Offset(1, 6) = Me.TextBox7.Value
             .Offset(1, 7) = Me.TextBox8.Value
             .Offset(1, 8) = Me.TextBox9.Value
             .Offset(1, 9) = Me.TextBox10.Value
             .Offset(1, 10) = Me.TextBox11.Value
             .Offset(1, 11) = Me.TextBox12.Value
             .Offset(1, 12) = Me.TextBox13.Value
             .Offset(1, 13) = Me.TextBox14.Value
             .Offset(1, 14) = Me.TextBox15.Value
             .Offset(1, 15) = Me.TextBox16.Value
             .Offset(1, 16) = Me.TextBox17.Value
             .Offset(1, 17) = Me.TextBox18.Value
             .Offset(1, 18) = Me.TextBox19.Value
             .Offset(1, 19) = Me.TextBox20.Value
             .Offset(1, 20) = Me.TextBox21.Value
             .Offset(1, 21) = Me.TextBox22.Value
             .Offset(1, 22) = Me.TextBox23.Value '(日付入力 2019/7/3)
            .Offset(1, 23) = Me.TextBox24.Value '(連番 1)
            .Offset(1, 24) = Me.TextBox25.Value
             .Offset(1, 25) = Me.TextBox26.Value

↑のコード、もっと簡潔にしましょう

            For Cx = 0 To 25
                .Offset(1, Cx).Value = Me.Controls("TextBox" & Cx + 1).Text
            Next

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

ひょっとして、「"」の定義の仕方で悩んで入りのかな?
 
「"」を2つつなげればできます。
 

Const ABxxxx As String = "=TEXT(Axxx,""yymm"")&TEXT(AAxxxx,""000"")"
Const ACxxxx As String = "=IF(Uxxxx="""","""",COUNTIFS(U$2:Uxxxx,"">""&EOMONTH(Uxxxx,-1),U$2:Uxxxx,""<=""&Uxxxx))"
 
あとは、前出と同じですね・・・

投稿日時: 19/07/08 08:35:36
投稿者: 丘珠

WinArrowさん度重なるアドバイスありがとうございます。
ただいま悪戦苦闘して作りこみしております。
数日中に完成、また疑問が出ましたら改めてアップしますすのでお時間いただけらばと思います。

投稿日時: 19/07/09 11:16:59
投稿者: 丘珠

かなりスッキリしたのですが、Gでエラーが出て対処できませんアドバイスをお願いします。
 
Private Sub CommandButton1_Click()
Dim RX As Long '@
Const SHIKI As String = "=COUNTIF($A$2:Axxx,Axxx)" 'A
Const ABxxxx As String = "=TEXT(Axxx,""yymm"")&TEXT(AAxxxx,""000"")"
Const ACxxxx As String = "=IF(Uxxxx="""","""",COUNTIFS(U$2:Uxxxx,"">""&EOMONTH(Uxxxx,-1),U$2:Uxxxx,""<=""&Uxxxx))"
 
    With Worksheets("Sheet1")
        With .Cells(.Rows.Count, "A").End(xlUp)
        For Cx = 0 To 26
        .Offset(1, Cx).Value = Me.Controls("TextBox" & Cx + 1).Text'G
         
            RX = .Row + 1 'B
        End With
        .Cells(RX, "AA").Formula = Replace(SHIKI, "xxx", RX) 'C
        Me.TextBox2.Text = .Cells(RX, "AA").Value 'D
        Me.TextBox16.Text = .Cells(RX, "AB").Value 'E
        Me.TextBox23.Text = .Cells(RX, "AC").Value 'F
    End With
End Sub

回答
投稿日時: 19/07/09 12:02:17
投稿者: よろずや

For Cx = 0 To 26

For Cx = 0 To 25

投稿日時: 19/07/09 12:24:22
投稿者: 丘珠

変更してみたのですが結果同じです。
いろいろ試してみたのですが。
アドバイスお願いします。。

回答
投稿日時: 19/07/09 13:55:11
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

        For Cx = 0 To 26
         .Offset(1, Cx).Value = Me.Controls("TextBox" & Cx + 1).Text'G
           
             RX = .Row + 1 'B

 
うまくいかない、最も、根本的な原因は、
提供されたコードのうわべだけ見ていることです。
要するに、コードの意味を理解していないことです。
 
↑のコードで、の中
> For Cx = 0 To 264

        For Cx = 0 To 25
それと
Next
が抜けている。
 
 

投稿日時: 19/07/09 15:50:15
投稿者: 丘珠

WinArrowさん度重なるご指導ありがとうございます。
一つ確認させてください。
フォーム上にテキストBOX以外にコンボックスを3個配置したのですがそれが悪さしているとことはありますか?
また、テキストBOX1〜25までありますが数字が飛んでしまった場合
テキストBOX1
テキストBOX2
テキストBOX5 といったような場合もエラーが発生しますか?
 
よろしくご指導願います。

回答
投稿日時: 19/07/09 16:56:44
投稿者: WinArrow
投稿者のウェブサイトに移動

丘珠 さんの引用:

WinArrowさん度重なるご指導ありがとうございます。
一つ確認させてください。
フォーム上にテキストBOX以外にコンボックスを3個配置したのですがそれが悪さしているとことはありますか?
また、テキストBOX1〜25までありますが数字が飛んでしまった場合
テキストBOX1
テキストBOX2
テキストBOX5 といったような場合もエラーが発生しますか?
 
よろしくご指導願います。

 
Me.Controls("TextBox" & Cx + 1)
というような記述は、
ユーザーフォームにたくさんのコントローrを配置した場合
例えば、テキストボックスの値をセルに代入するオーようなコードを共通化するための1つのテクニックです。今回の場合は、セルの列番号とテキストボックスの番号部分に規則性があるので
その規則性を使ってコードを単純化しました。
このような規則性を見つける、又は、規則性をつくることも、スキルアップにつながります。
 
規則性が確保できなければ、最初のようなコードを書くしかありません。
 
私は、Excelが勝手につけるコントロール名をほとんど使いません。
例、テキストボックスだったら
txtBASYO01,txtBASYO02・・・・の様に名前自体にグループ名、さらに、番号とします。
 
結論から言いますと、
コマンドボタンは、無関係です。
コントール名の中にある番号と列番号とが一致しなければ、エラーになります。
存在しないコントロール名は処理できませんから・・・
 
ところで、
Next
は、記述しましたか?
ステップ実行も実施していますか?

回答
投稿日時: 19/07/09 20:33:00
投稿者: simple

文字列定数 ABxxxxおよびACxxxxのなかの x の数が
3つのところと4つのところが混在しているので、
このままだと不都合が起きます。
SHIKIに倣って3つに統一したほうがよいと思います。
単なる入力ミスでしょうが、
もし質問者さんが気が付かずに苦労していたらいけないので、
予め指摘しておきます。

回答
投稿日時: 19/07/09 21:43:42
投稿者: WinArrow
投稿者のウェブサイトに移動

simple さんの引用:
文字列定数 ABxxxxおよびACxxxxのなかの x の数が
3つのところと4つのところが混在しているので、
このままだと不都合が起きます。
SHIKIに倣って3つに統一したほうがよいと思います。
単なる入力ミスでしょうが、

 
ご指摘ありがとうございます。
 
 
丘珠 さんへ
xの数を、合わせたつもりでしたが、xの数を3つに統一してください。

投稿日時: 19/07/10 16:34:22
投稿者: 丘珠

WinArrowさん、simpleさんアドバイス有難うございます。
おかげさまで出来ました。
此れから登録した内容の読み込み、保存の作成ですまたな何かありましたらアドバイスお願いします。
有難うございます。