プロが教えるわが家の防犯対策術!

こんにちは。下記のコードをFor Eachを使わずに書き換えることは可能でしょうか?

For Each c In rg.Offset(, 1).Cells
fName = FolderPath & "\" & c.Value
Set p = c.Worksheet.Shapes.AddPicture(fName, _
False, True, c.Left, c.Top, c.Width, c.Height)
Next c
rg.Offset(, 1).ClearContents

質問者からの補足コメント

  • できればFor Nextで書き換えたいです。
    よろしくお願いします。

      補足日時:2021/01/22 15:31
gooドクター

A 回答 (4件)

こんにちは、


For Eachの方が理想的なような気がしますが
Rangeオブジェクト範囲をFor Nextにする場合、単純に考えると
こんなんでも出来るかと

Dim rg As Range, fName As String
Dim i As Long
Set rg = Range("A1:B5") 'セット方法、範囲は不明
For i = 1 To rg.Cells.Count
fName = FolderPath & "\" & rg(i).Offset(, 1).Value

Next

但し、この方法の場合For Eachと同じで、、例の範囲の場合
A1 B1 A2・・・と言う順番で取得する事になります。
結果、For Eachと同じなのにカウント変数が必要になってしまうので使う事は少ないかと思います。
取得順番を操作したい場合は、#2さんの回答にあるように
行列共にカウント変数をたてる事になります。

結合セルが含まれる範囲に対しての処理で使用する場合は、いずれも工夫が必要になりますね。が、考えすぎでした。理由が分からないのでこの辺で
    • good
    • 0

Dim i As Long, j As Long



For i = rg.Cells(1, 1).Row To rg.Cells(rg.Rows.Count, 1).Row
For j = rg.Cells(1, 1).Column + 1 To rg.Cells(1, rg.Columns.Count).Column + 1

With Cells(i, j)
fName = FolderPath & "\" & .Value
Set p = .Worksheet.Shapes.AddPicture(fName, _
False, True, .Left, .Top, .Width, .Height)
End With

Next
Next
    • good
    • 0

このコードをってならちょっと厳しく感じる部分は初級者の私にはあります。



変数:rg が示すセル範囲がわからないからです。
もし rg を活かしたままでってならスル~っと流してください。
    • good
    • 0

可能かと言われれば可能ですが・・・・・



汎用性が無いのとミスが起きやすいので
使えるのならForEach使ってください
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング