Excel (VBA)

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

 
(Windows 8 : Excel 2013)
決まっている配列での入力文字を取得するには
投稿日時: 19/06/25 09:54:33
投稿者: eco2019

お世話になっております。
 
下記の配列でのセルに入力がある文字を取得したいです。
1ページ〜3ページ以上あります。
 
'1ページ目
B7、AP7、CD7
B27、AP27、CD27
B47、AP47、CD47
 
 
'2ページ目
B75、AP75、CD75
B95、AP95、CD95
B115、AP115、CD115
 
 
'3ページ目
B143、AP143、CD143
B163、AP163、CD163
B183、AP183、CD183
 
 
1ページ目から次のページ以降はどう書けばよいでしょうか?
For t = 7 To Cells(Rows.Count, 2).End(xlUp).Row
 
'写真番号
TextBox1 = Range("B" & t).Value _
& vbCrLf & _
Range("AP" & t).Value _
& vbCrLf & _
Range("CD" & t).Value _
& vbCrLf &
Range("B" & t+20).Value _
& vbCrLf & _
Range("AP" & t+20).Value _
& vbCrLf & _
Range("CD" & t+20).Value _
& vbCrLf &
Range("B" & t+40).Value _
& vbCrLf & _
Range("AP" & t+40).Value _
& vbCrLf & _
Range("CD" & t+40).Value _
 

回答
投稿日時: 19/06/25 11:31:26
投稿者: Suzu

こんな事が知りたいという事でしょうか。
 
  For i = 0 To 100
    For j = 0 To 2
      Debug.Print CStr(j * 20 + i * 68 + 7)
    Next
  Next

回答
投稿日時: 19/06/25 11:33:20
投稿者: WinArrow
投稿者のウェブサイトに移動

質問
 
1ページ、2ページ
と書かれていますが、1つのシート内ですよね?
 
その場合、ページを意識する必要はなく、
いくつかのセル範囲という認識でよいです。
 
今回の場合、
3つの範囲があり、
各々のセルの個数は9個
行は、+20、列は、+40
左端のセルアドレスの感覚が68行と
という規則性があるから、
↓のようなループ処理が簡便かも
 
Dim i As Long, j As Long, k As Long, n As Long
 
    Me.TextBox1.Text = ""
    For i = 1 To 3
        n = (i - 1) * 68
        For j = 7 To 47 Step 20
            For k = 2 To 82 Step 40
                If Me.TextBox1.Text <> "" Then Me.TextBox1.Text = Me.TextBox1.Text & vbLf
                Me.TextBox1.Text = Me.TextBox1.Text & Cells(n + j, k).Value
            Next
        Next
    Next
 
 
 

回答
投稿日時: 19/06/25 11:43:26
投稿者: WinArrow
投稿者のウェブサイトに移動

2つほどのコメントあります。
1つめ
>For t = 7 To Cells(Rows.Count, 2).End(xlUp).Row
 
このコードは、7行目から、列Bのデータ最終行までループする
というコードであり、
掲示の3ページといっている最終行までという指定になります。
1ページという範囲だけのループではないということです。
 
2つ目
改行コードに
vbCrLf
を使っているが
vbLf
で充分です。
不必要に文字数を増やすことはないと思います。

回答
投稿日時: 19/06/25 11:51:57
投稿者: WinArrow
投稿者のウェブサイトに移動

素朴な疑問
 
テキストボックスに
写真番号を改行付きで複数入れていますが、
どのように使うのでしょうか?

投稿日時: 19/06/25 15:55:19
投稿者: eco2019

Suzuさん、WinArrowさん、有難うございます。
 
1つのシート内です。
For j = 7 To 47 Step 20という風に与えればいいのですね。
 
 
テキストボックスに
写真番号を改行付きで複数入れているのは、ユーザーフォームの1画面でチェック出来ないかと思い、
このようにしました。
 
私が順番を間違えてましたので、下記のようにしました。
TextBox2は、次に書いていいのでしょうか・・・数が合わなかったので、多分、違ったと思いますが、ご教授ください。
宜しくお願い致します。
 
 
Dim i As Long, j As Long, k As Long, n As Long
  
    Me.TextBox1.Text = ""
    For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row / 68
        n = (i - 1) * 68
        For k = 2 To 82 Step 40
            For j = 7 To 47 Step 20
                If Me.TextBox1.Text <> "" Then Me.TextBox1.Text = Me.TextBox1.Text & vbLf
                Me.TextBox1.Text = Me.TextBox1.Text & Cells(n + j, k).Value
            Next
        Next
    Next
  
 
 
     
    Me.TextBox2.Text = ""
    For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row / 68
        n = (i - 1) * 68
        For k = 8 To 82 Step 40
            For j = 7 To 47 Step 20
                If Me.TextBox2.Text <> "" Then Me.TextBox2.Text = Me.TextBox2.Text & vbLf
                Me.TextBox2.Text = Me.TextBox2.Text & Cells(n + j, k).Value
            Next
        Next
    Next

回答
投稿日時: 19/06/25 17:16:11
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

私が順番を間違えてましたので、下記のようにしました。
TextBox2は、次に書いていいのでしょうか・・・数が合わなかったので、多分、違ったと思いますが、ご教授ください。

 
すみません。・・・・さっぱり話が見えません。
 
何をどのように間違えたのかわかりません。
TextBox2
は、何?
数が合わない・・って、どのようなこと?
 
 
 

回答
投稿日時: 19/06/25 17:22:35
投稿者: WinArrow
投稿者のウェブサイトに移動

>ユーザーフォームの1画面でチェック出来ないかと
 
目視でチェック?
 
写真番号だけで存在確認するということでしょうか?
 
私だったら、
リストボックスを使って、
1列目:セルアドレス、2列目:写真番号
のようにしますが・・・・
 
 

回答
投稿日時: 19/06/25 18:35:43
投稿者: WinArrow
投稿者のウェブサイトに移動

リストボックスにセットするコード例
 
Private Sub UserForm_Initialize()
Dim i As Long, j As Long, k As Long, n As Long
Dim LastRow As Long
 
     With Me.ListBox1
        .Clear
        .ColumnCount = 2
        .ColumnWidths = "60;120"
    End With
    With ActiveSheet
        LastRow = WorksheetFunction.RoundUp(.Range("B" & .Rows.Count).End(xlUp).Row / 68, 0)
        For i = 1 To LastRow
            n = (i - 1) * 68
            For j = 7 To 47 Step 20
                For k = 2 To 82 Step 40
                    Me.ListBox1.AddItem ""
                    Me.ListBox1.List(Me.ListBox1.ListCount - 1, 0) = .Cells(n + j, k).Address(0, 0)
                    Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = .Cells(n + j, k).Value
                Next
             Next
         Next
     End With
End Sub

回答
投稿日時: 19/06/25 18:43:33
投稿者: Suzu

ループ沢山は、、訳わからなくなり易いので・・
 
条件式で 処理行 を飛ばします。
 
For を使うなら、最終セル取得が必要でしょうが
Do 〜 Loop なら、あと判定でいけますよね。
 
Sub Sumple2()
  Dim i As Long
  Dim strA As String
 
  i = 7
  Do
    strA = Cells(i, "B") & vbTab & Cells(i, "AP") & vbTab & Cells(i, "CD")
    Debug.Print strA
    strA = ""
    i = i + 20
    If i Mod 17 = 16 Then i = i + 8
  Loop While Not Cells(i, 2) = ""
End Sub

回答
投稿日時: 19/06/25 21:41:10
投稿者: WinArrow
投稿者のウェブサイトに移動

>私が順番を間違えてましたので
について
 
 
横方向(列B→列AP→列CD)
という順番を
縦方法を優先する
ということですね?
 
このようなことは、大した問題ではありません。
 
それよりも、
TextBox2
の件をきちんと説明してください。
kを「8」(列H)から始めていますが、
Hからだと、82ではなく、88にしないと、
考え方として整合しませんね?
 

投稿日時: 19/06/26 09:00:24
投稿者: eco2019

お世話になります。
 
大変遅くなりました。リストボックスにセットするコード例、有難うございます。
 
目視でチェックし、TextBoxを使ったのは、別なシートに一覧表があるのですが、そこにコピーすることも
考慮し、TextBoxにしてみました。
 
 
Suzuさん、条件行という方法もあるのですね。有難うございます。
 
 
WinArrowさん、大したことでありませんでしたが、ご指摘のように横方向(列B→列AP→列CD)という事です。
TextBox2 は、確かにH8から始まっております。そうですね、H88ですね。有難うございます。

回答
投稿日時: 19/06/26 14:30:43
投稿者: WinArrow
投稿者のウェブサイトに移動

通常、列番号を英字で使っているのに対して、数字でコード記述をすると
分かりにくいですね。
ちょっと回りくどいですが、わかりやすくする方法を焼死します。
 

> For k = 2 To 82 Step 40

    Dim 間隔 As Long
        間隔 = .Columns("AP").Column - .Columns("B").Column
        For k = .Columns("B").Column To .Columns("CD").Column Step 間隔
 

投稿日時: 19/06/27 09:47:37
投稿者: eco2019

お世話になります。
 
WinArrowさん、承知しました。どうも有難うございます。