前提・実現したいこと
Excel VBAを使用しています。
Sheet1には
![]
↑このような文字列がセルに入力されています。
このうち、文字列に『→』を含むセルのみを別ブックのSheet2に表示させたいです。
例えば上に貼付致しました画像の場合ですと、Sheet2に
↑このように一括表示させたいです。
「d→e」が入力してあるCells(1,2)は1行目の2列目、「j→k」が入力してあるCells(3,3)は3行目の3列目なのでこのような表示になります。
手順といたしましては
①行番号と列番号をそれぞれ(i,j)と置きRange("A1","C3")のセルを一括で取得
②「→」を含むセル番号をSheet2に一括表示
という流れになるのかな...と思いましたが、それをコードで表すことができず悩んでおります。
もしわかる方がいらっしゃいましたらアドバイスなどよろしくお願い致します。
発生している問題・エラーメッセージ
該当のソースコード
ExcelVBA
試したこと
補足情報(FW/ツールのバージョンなど)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
やりたいことに対して手順をざっくりと捉えすぎていることが「コードで表すことができない」原因だと思います。
もう少し掘り下げたいところですね。
特に「一括で取得」「一括表示」というあたりに問題がありそうだと感じました。
必要な情報をごちゃっと渡せばこちらの都合のいい形で結果を返してくれる関数など、ほとんどの場合ありません。
ないから自分でコーディングするんですよね。
やりたいことをひとつひとつ積み上げて形にしていくのがコーディングです。
今回の場合、「一括処理」とイメージしている部分を「対象セルひとつひとつに、同じ処理を繰り返す」と考えてみてはどうでしょうか。
① Range("A1:C3")のセル範囲からセルを1つずつ取り出すループ処理
② 取り出したセルに「→」が含まれているか判定(InStr関数、IF文)
③-a 「→」が含まれている場合、対象セルの行番号と列番号を取得し、Sheet2の各セルに出力。(Sheet2の何行目に出力するのかも制御しないとですね。Range.End(xlUp)など。)
③-b 「→」が含まれていない場合、特に処理しない
④ ②~③を取り出すセルがなくなるまで繰り返す
こうなると、ひとつひとつのセルに対する処理ではそんなに難しいキーワードはでてこなくなるのではないでしょうか?
例えば①なら
For Each c In Sheet1.Range("A1:C3") '←① Msgbox c.Row & "," & c.Column '←③aのヒント Next '←④
でセル範囲からセルを1つずつ取り出すループ処理ができます
②はIf文とInstr関数を組み合わせれば取り出したセルの文字に「→」が含まれるかチェックできます。
他の方のアドバイスも参考に、まずは作ってみてください。
ちなみに、対象のセル範囲に対してFind関数で検索をする方法もあります。
この場合、検索結果が見つかれば1セルずつ返されるので、検索が見つかる限り繰り返し処理するループ処理を作ることになります。
こちらの方がループ回数は少なくなりますが、少し高度なコーディングになりますね。
今回は対象セル数も少ないので、まずはInstr関数での検索でいいと思います。
とりあえず手を動かしてがんばってみてください。
投稿2019/03/05 01:17
編集2019/03/05 01:36総合スコア3013
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/05 02:03
2019/03/09 05:15
0
既に回答がありますが、一応odanngo_taifuさんのお勉強の為に別の方法を。
1.Cellsを使うと、列番号、行番号でセルにアクセスできます。
2.Selectionを使うと、アクティブシートのセレクトされたセルの集合を表します。
つまりどこを選択した状態でも、プログラムコードに依存しない作りが可能です。
vba
1Sub hogehoge() 2 Dim intcol As Integer: intcol = 1 3 Dim introw As Integer: introw = 1 4 Dim cellpoint As Range 5 For Each cellpoint In Selection 6 If (InStr(cellpoint.Value, "→") <> 0) Then 7 Worksheets(2).Cells(introw, intcol).Value = cellpoint.Row 8 Worksheets(2).Cells(introw, intcol + 1).Value = cellpoint.Column 9 introw = introw + 1 10 End If 11 Next cellpoint 12 Range("A1").Select 13End Sub
投稿2019/03/04 18:10
総合スコア183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/05 01:33 編集
2019/03/09 05:08
0
ベストアンサー
For Each と、InStr と、Offset を使いました。
シート(Sheet2) の、見出しは1行目、行列値の書き込みが2行目からだとして
データ上書きの例と、データ追記の例を貼りましたので参考にしてみて下さい。
見出し行などの条件が変わると期待するセルに書き込んでくれません。
書き直してみて下さい。
データ追記の例で使った End(xlUP) は、キーボードの 「End」「↓」「↑」 です。
vbc
1Dim Rng As Range 2Dim r As Integer 3 4For Each Rng In Sheets("Sheet1").Range("A1:C3") 5 If InStr(Rng.Value, "→") > 0 Then 6 With Sheets("Sheet2") 7 .Range("A2").Offset(r).Value = Rng.Row 8 .Range("B2").Offset(r).Value = Rng.Column 9 End With 10 r = r + 1 11 End If 12Next Rng
vba
1Dim Rng As Range 2Dim r As Integer 3 4r = Cells(Rows.Count, 1).End(xlUp).Row 5 6For Each Rng In Sheets("Sheet1").Range("A1:C3") 7 If InStr(Rng.Value, "→") > 0 Then 8 With Sheets("Sheet2") 9 .Range("A1").Offset(r).Value = Rng.Row 10 .Range("B1").Offset(r).Value = Rng.Column 11 End With 12 r = r + 1 13 End If 14Next Rng
投稿2019/03/04 17:41
総合スコア52
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Sub test() Const cMyKye As String = "*→*" Dim rngTable As Range Dim rngTarget As Range Dim c As Range Dim ixRow As Long ThisWorkbook.Worksheets("Sheet1").Copy Set rngTable = Workbooks(Workbooks.Count).Worksheets(1).Range("A1").CurrentRegion rngTable.Replace cMyKye, "" On Error Resume Next Set rngTarget = rngTable.SpecialCells(xlCellTypeBlanks) On Error GoTo 0 If rngTarget Is Nothing Then Exit Sub ixRow = 2 With ThisWorkbook.Worksheets("Sheet2").Cells For Each c In rngTarget .Item(ixRow, 1).Value = c.Row .Item(ixRow, 2).Value = c.Column ixRow = ixRow + 1 Next End With rngTable.Worksheet.Parent.Close False End Sub
遊びで別案。
置換機能で空白にし、ジャンプ機能で検索するようにしてみました。
参考になれば。。。(セルを読む量を減らしてみたけど、速度的には不明。)
投稿2019/03/05 12:47
総合スコア2136
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。