- ベストアンサー
エクセルマクロでループさせる方法を教えてください
- エクセルのマクロを使ってループさせる方法を教えてください。現在のコードではセルN2に結果が表示されますが、N2以降のセルにも同じように結果を表示するためにはどうすればいいでしょうか?詳しいコード全体を教えてください。
- エクセルのマクロを使用してループさせる方法を教えてください。現在のコードではセルN2に結果が表示されるようになっていますが、N2以降のセルにも同じ処理を行うためにはどのように変更すればよいのでしょうか?詳しいコードを教えてください。
- エクセルのマクロを使ってループさせる方法を教えてください。現在のコードではセルN2に結果が表示されるようになっていますが、N2以降のセルにも同じように結果を表示するためにはどのように修正すればいいですか?具体的なコードの全体を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
これで少しは分かりやすくなるのではないでしょうか? Sub test2() Const LFeed As String = vbCrLf Dim st As String Dim sht As Worksheet, i As Long, obj Set sht = ActiveSheet '//現在のシートを設定 Dim MaxRow As Long MaxRow = Range("A65536").End(xlUp).Row For i = 1 To MaxRow If Cells(i, 1) <> "" Then Set Grammar = Nothing 'HTML1行ずつ記載しています st = "" st = "<div align='center'><b>" & Cells(i, 4) & "</b></div>" & LFeed st = st & "<div align='center'><a rel='nofollow' href='" & Cells(i, 8) & "'><img src='" & Cells(i, 9) & "' border='0' alt='" & Cells(i, 3) & "'></a></div>" & LFeed st = st & "<div align='center'><a rel='nofollow' href='" & Cells(i, 8) & "'>" & Cells(i, 3) & "</a></div>" & LFeed st = st & Cells(i, 5) & LFeed st = st & Cells(i, 6) & LFeed st = st & "<!--" & Cells(i, 1) & Cells(i, 2) & "-->" st = Replace(st, "'", Chr(34), 1, -1, 1) sht.Cells(i, 14).Value = Mid(st, 1, Len(st) - 1) '//結果をN列に入れる End If Next i End Sub "(ダブルクォート)はやはり'(シングルクォート)で記載して後で置換える方が良いと思います。 他にもCollectionオブジェクトや、Textstreamオブジェクトを使うのも手ですが、今回は一番単純に分かりやすくなるように書いてます。 もっと分かりやすくする為にはHTMLの構文の所を設定ファイルとして外部で持って、それを読み込んで使うというのもありだと思うし、色々やり方はありますね。 後々楽に作業できるようにする為にも頑張ってくださいね。
その他の回答 (4)
- pkh4989
- ベストアンサー率62% (162/260)
こんにちは。 以下のマクロを試してみてください。 Sub test() Dim st As String, s As String, stmp As String Dim sht As Worksheet, rw As Long, col As Long Dim MaxRow As Long With ActiveSheet '//現在のシートを設定 MaxRow = .Range("A" & Rows.Count).End(xlUp).Row For rw = 1 To MaxRow If Cells(rw, "A") <> "" Then '//雛型の文字を設定 st = "<div align=""center""><b>" st = st & .Range("D" & rw) & "</b></div>@" st = st & "<div align=""center""><a rel=""nofollow"" href=""" st = st & .Range("H" & rw) & """><img src=""" st = st & .Range("I" & rw) & """ border=""0"" alt=""" st = st & .Range("C" & rw) & """></a></div>@<div align=""center""><a rel=""nofollow"" href=""" st = st & .Range("H" & rw) & """>" st = st & .Range("C" & rw) & "</a></div>@" st = st & .Range("E" & rw) & "@" & .Range("F" & rw) & "@" st = st & "<!--" & .Range("A" & rw) & .Range("B" & rw) & "-->" st = Replace(Replace(st, "@", Chr(10), 1, -1, 1), "'", Chr(34), 1, -1, 1) s = st '//雛型の文字をコピー For col = 1 To 9 '//A~Iカラムまでをループ(col=列番号) stmp = "$" & Format(col, "#") '//各セルの内容で置換え s = Replace(s, stmp, .Cells(rw, col).Text, 1, -1, 1) Next .Cells(rw, "N").Value = s '//結果をN列に入れる End If Next End With End Sub
- lul
- ベストアンサー率41% (10/24)
こんにちは 以下のコードでご希望の処理になるのではないでしょうか。 Sub test() Dim st As String, s As String, stmp As String Dim sht As Worksheet, rw As Long, col As Long Dim MaxRow As Long MaxRow = Range("A65536").End(xlUp).Row st = "<div align='center'><b>$4</b></div>@<div align='center'><a rel='nofollow' href='$8'><img src='$9' border='0' alt='$3'></a></div>@<div align='center'><a rel='nofollow' href='$8'>$3</a></div>@$5@$6@<!--$1$2-->" st = Replace(Replace(st, "@", Chr(10), 1, -1, 1), "'", Chr(34), 1, -1, 1) Set sht = ActiveSheet '//現在のシートを設定 For rw = 1 To MaxRow If Cells(rw, 1) <> "" Then '------- 1行分の処理 ---- s = st '//雛型の文字をコピー For col = 1 To 9 '//A~I列までをループ(col=列番号) stmp = "$" & Format(col, "#") '//各セルの内容で置換え s = Replace(s, stmp, sht.Cells(rw, col).Text, 1, -1, 1) Next col sht.Cells(rw, 14).Value = s '//結果をN列に入れる End If Next rw End Sub 他の回答者様のを少しいじっただけですが…。
お礼
ご回答ありがとうございまいした。 思うように出来て大変感謝しています。 また、質問ついでにお聞きしたいのですがよろしいでしょうか? st = "<div align='center'><b>$4</b></div>@<div align='center'><a rel='nofollow' href='$8'><img src='$9' border='0' alt='$3'></a></div>@<div align='center'><a rel='nofollow' href='$8'>$3</a></div>@$5@$6@<!--$1$2-->" これなんですが、今回はテンプレートが短かった為これでもいいのですが、複雑な物になると分かりにくいです。 そこで print "・・" & range("?") & "・・・" print "・・" & range("?") & "・・・" print "・・" & range("?") & "・・・" このようにする場合はどのようにすればいいでしょうか?
- pkh4989
- ベストアンサー率62% (162/260)
(1) 最後に以下の1行を追加するか ' sht.Range("N" & rw & ":N100").FillDown '←追加 (N2~N100まで) (2) For で回すなら以下のようにしてください。 Sub test() Dim st As String, s As String, stmp As String Dim sht As Worksheet, rw As Long, col As Long st = "<div align='center'><b>$4</b></div>@<div align='center'><a rel='nofollow' href='$8'><img src='$9' border='0' alt='$3'></a></div>@<div align='center'><a rel='nofollow' href='$8'>$3</a></div>@$5@$6@<!--$1$2-->" st = Replace(Replace(st, "@", Chr(10), 1, -1, 1), "'", Chr(34), 1, -1, 1) Set sht = ActiveSheet '//現在のシートを設定 s = st '//雛型の文字をコピー For rw = 2 To 100 '←追加 (2~100行分の処理) For col = 1 To 9 '//A~Iカラムまでをループ(col=列番号) stmp = "$" & Format(col, "#") '//各セルの内容で置換え s = Replace(s, stmp, sht.Cells(rw, col).Text, 1, -1, 1) Next sht.Cells(rw, 14).Value = s '//結果をN列に入れる Next End Sub
補足
pkh4989さん ご回答ありがとうございます。 今、試してみましたが失敗しました。 これで試すとN2N3N4・・・のセルは全て同じ内容が表示されてしまいます。 また(1)で試した方のが処理スピードが速い感じでした。 ●ちょっとしつこいようですが、もう一度質問を書いておきます。 ---------------------------------------------------------------- エクセルにはセルA~Mまでデータが入っています。(件数的にはかなりの量です) そこでマクロを使ってセルN内に以下のようなHTMLを入れたいです。 <div align="center"><b>【Dのセル】</b></div> <div align="center"><a rel="nofollow" href="【Hのセル】"><img src="【Iのセル】" border="0" alt="【Cのセル】"></a></div> <div align="center"><a rel="nofollow" href="【Hのセル】">【Cのセル】</a></div> 【Eのセル】 【Fのセル】 <!--【Aのセル】【Bのセル】--> ---------------------------------------------------------------- A~Mにデータが入っている行はN列に表示、A~Mにデータが入っていない場合は表示されないようにしたいです。 よろしくお願いします。
- n-jun
- ベストアンサー率33% (959/2873)
Sub Try() Dim rw As Long, col As Long For rw = 2 To 1000 '1000行目までとして For col = 1 To 9 '9列目までとして Cells(rw, col).Value = "abc" Next col Next rw End Sub 2行目から1000行目までの、1列目から9列目まで"abc"を代入してます。 ご参考程度に。
お礼
lulさん ご回答大変ありがとうございます。 これで、思うような事ができます。 本当にありがとうございました。