• ベストアンサー

EXCEL VBAでの表の転記方法?

表1(A1:A20)に飛び飛びに入ったデータを表2(E11:E30)に上から順に空白が無いように転記するマクロは下記の通りなんとか作れました。 ただし、これが正しいやり方かどうかは自信がありませんのでもっといい方法があればご教示ください。 次にこれが、表1がA1:B10と2列になっており、表2も同じくE11:D20と2列になっている場合のやり方(E11から始まりE20まできたら次はD11以降に転記する)が見当がつきません。どのように記述すればいいのでしょうか? Sub 転記() Dim i As Integer, n As Integer n = 10 With Worksheets("DATA1") For i = 1 To 20 If .Range("A" & i) <> "" Then n = n + 1 .Range("E" & n) = .Range("A" & i) End If Next i End With End Sub よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

プログラムなんて動けばいいのです。 分かりやすさは、その次。 Dim i As Integer, n As Integer Dim a,b as string Dim i2 As Integer, n2 As Integer n = 10 a="A" b="E" i2=0 n2=0 With Worksheets("DATA1") For i = 1 To 20 if i=11 then a="B" i2=10 end if If .Range(a & i - i2) <> "" Then n = n + 1 if n=21 then b="D" n2=10 end if .Range(b & n - n2) = .Range(a & i - i2) End If Next i End With End Sub 未確認ですが・・・。 あと cells を使う方法もあります。

AQUALINE
質問者

お礼

おそくなってすみません。 出来ました! なるほど、こういう方法なんですね。ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

短くなるように Sub test01() Dim c As Range Dim r(3) r(1) = 1: r(2) = 1 For Each c In Worksheets("sheet1").Range("a1:b10") If c = "" Then Else Worksheets("sheet2").Cells(r(c.Column), c.Column) = c r(c.Column) = r(c.Column) + 1 End If Next End Sub '-------- Sheet1が何列になろうとも (A)Dim r(3)の3を4等と、r(2)=1のところをr(3)=1、・・などと増やす。 (B)Range(A1:N50)等と増やす だけで手直しが少ないです。

AQUALINE
質問者

お礼

ありがとうございました。 それぞれの列だけをみれば上に詰まったのですが、残念ながら、列をまたいではなりませんでした。

  • TTak
  • ベストアンサー率52% (206/389)
回答No.2

こんにちは。私はEXCELの機能をなるべくそれを生かすようにします。たとえば、ワークシート関数をつかって、次のようにFor-Next文を廃止できますね。 Sub 転記() Range("E11").FormulaR1C1 = "=INDEX(R[-10]C[-4]:R[8]C[-4],ROW()-10,1)" Range("E11").AutoFill Destination:=Range("E11:E20"), Type:=xlFillDefault Range("E11:E20").Value = Range("E11:E20").Value End Sub

AQUALINE
質問者

お礼

ありがとうございました。 でも残念ながら思った様にはなりませんでした。

関連するQ&A