プロが教える店舗&オフィスのセキュリティ対策術

白紙のSheet1に、下記の3法則により数値を記入するVBAをご教示ください。

(1) A列に20001から24000まで連番を振る、
 ただし連番は、単に1ずつでなく同じ番号が12回振られて1増加する

(2) B列に2004年12月から2005年11月までの年月を表す6桁数値を12か月分コピーを繰り返す

(3) C列に、A列とB列を結合して数値変換する式を入力(式でなくてもよいですが)
 例:C1列は、
   Range("C1").Select
   ActiveCell.FormulaR1C1 = "=(RC[-2]&RC[-1])*1"

A列  B列  C列
20001 200412 20001200412
20001 200501 20001200501
20001 200502 20001200502
20001 200503 20001200503
20001 200504 20001200504
20001 200505 20001200505
20001 200506 20001200506
20001 200507 20001200507
20001 200508 20001200508
20001 200509 20001200509
20001 200510 20001200510
20001 200511 20001200511
20002 200412 20002200412
20002 200501 20002200501
20002 200502 20002200502
20002 200503 20002200503
20002 200504 20002200504
 :
24000 200511 24000200511

PHPでなら下記のようにして実現できるのですが、移植できません…
<?php
 for($i=20001;$i<=24000;$i++){
  for ($j=1; $j<=12;$j++){
   if ($j==1){
    $body .= $i . "200412" . $i . "200412<br>\n";
   } elseif ( $j == 2 ) {
    $body .= $i . "200501" . $i . "200501<br>\n";
   } elseif ( $j == 3 ) {
【途中ばっさり省略】
   } elseif ( $j == 12 ) {
    $body .= $i . "200511" . $i . "200511<br>\n";
   }
  }
}
?>
<html>
<body>
<?= $body ?>
</body>
</html>

A 回答 (2件)

>PHPでなら下記のようにして実現できるのですが、移植できません…



CSV出力して読み込ませる方法もありますが・・・?

VBAなら
Sub tes1()
Dim i As Long
Dim j As Integer
Dim ct As Long

ct = 1
For i = 20001 To 24000
For j = 1 To 12
Cells(ct, 1) = i
If j = 1 Then
Cells(ct, 2) = "200412"
Else
Cells(ct, 2) = "2005" & Format(j - 1, "00")
End If
Cells(ct, 3) = Cells(ct, 1) & Cells(ct, 2)
ct = ct + 1
Next
Next
End Sub
    • good
    • 0
この回答へのお礼

hana-hana3さん、レスありがとうございました。

>CSV出力して読み込ませる方法もありますが・・・?

それができれば、本件で作るテキストを別途用意しておいて
読み込ませれば本マクロは不要でしたね・・・

ともあれ、また別機会に質問させていただきます。

>VBAなら

For構文の書き方がよくわからなかったのですが
大変よく理解できました。活用させていただきます。ありがとうございました。

お礼日時:2006/07/19 21:24

Dim a(47999, 2)


For i = 0 To (UBound(a, 1) + 1) / 12 - 1
For j = 0 To 11
tmp1 = CStr(20001 + i)
tmp2 = Format(DateSerial(2004, 12 + j, 1), "yyyymm")
a(i * 12 + j, 0) = tmp1
a(i * 12 + j, 1) = tmp2
a(i * 12 + j, 2) = tmp1 + tmp2
Next
Next
Range(Cells(1, 1), Cells(UBound(a, 1) + 1, UBound(a, 2) + 1)).Value = a
    • good
    • 0
この回答へのお礼

yambejpさん、さすが、分野を問わない博学ぶり、脱帽です。
本当にありがとうございます。

yyyymmの連続性に着目いただき、連続的に処理するというわけですね。
すごい効率よさそうです。

a(47999, 2)の47999は、Excelの日付のシリアル値かとおもいましたが
2031/5/31 ですね、突き止められませんでしたが、調べてみます。

ありがとうございました。

お礼日時:2006/07/19 21:47

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