• 締切済み

エクセルマクロについて質問です。

エクセルマクロについて質問です。 初心者が敷居の高いことを試みて困っています。   A      B      C      D      E      F   ・・・・・・ 1転送日付    1  2転送項目 転送値  転送項目   1日    2日    3日  ・・・・・・ 3  a      10     a 4  b       18     b 日々の集計項目(a,b,c,d・・・・・)の値は、B列に161行あります。 そのB列のデータを、B1で指定した日付(上記の場合は1日)に転記させて あげたいのです。 (B3→D3へ、B4→D4へ、・・・) 翌日のデータ(B1は2→2日)に転送させます。(B3→E3、B4→E4、・・・) という具合です。 B列には計算式が入っております。 これを機に、マクロの記述も勉強したいとおもっており、良いきっかけになれば、 と思っています。何とぞ宜しくお願い申し上げます。

みんなの回答

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

短くを旨として考えた。初心者向けではないかもしれない。ただしセルの値のみ対象。 Sub test01() c = Range("A1")+ 3 '1日がD列からのため+3 Dim m As Variant m = Range("B3:B161") 'B列の値を一斉に取得 s = Columns(c).Address(False, False) '例 31日はAH:AHのように返る Cl = Split(s, ":") '例 AH部分を取り出すため:で分離 Range(Cl(0) & "3:" & Cl(0) & "161") = m '所定列へセット Range("B3:B161")="" 'B列データ消去 End Sub

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.7

既に回答が出ていますが >これを機に、マクロの記述も勉強したいとおもっており、良いきっかけになれば、 とありますので補足しておきます。 目的を達成するために 1、B2~B161をコピィして、値として貼り付け方法 2、D3のセルに B2セルの値を入れる、これを161行目まで繰り返す。 この2つの方法を思い浮かべると思います。 マクロの記述の勉強というのであれば、2案の方法で For~Next 繰り返し処理 とCell、Rangeでセルの指定の仕方について最初に勉強した方が良いでしょう。 http://excelvba.pc-users.net/ のサイトの For~Nextとセルの指定についてを一読してください。 Tom04さんのコードをおかりしますが Sub test() RETU=Range("B1").Value + 3 For i = 3 To 161 Cells(i,RETU).Value = Cells(i, 2).Value Next i End Sub としたらわかりやすくないですか。 目的が達成できただけでなく、コードの意味と理屈を理解してください。

  • mar00
  • ベストアンサー率36% (158/430)
回答No.6

Sub Macro1() Range(Cells(3, 2), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2)).Copy Cells(3, Range("B1").Value + 3).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

ANo2です Range("B2:B164").Copy Cells(2, Cells(1, 2).Value + 3).PasteSpecial ↓ Range("B3:B164").Copy Cells(2, Cells(1, 3).Value + 3).PasteSpecial でした。3行目なのに2行目と勘違いしてました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! ごくごく単純にやってみました。 操作したいSheet見出し上で右クリック → コードの表示 白い画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub test() Dim i As Long For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, Cells(1, 2) + 3) = Cells(i, 2) Next i End Sub こんな感じで良いのですかね? 参考になればよいのですが・・・m(__)m

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.3

まずは実際の動作をマクロの記録でマクロ化してみましょう とりあえずB3:B163のセル範囲をコピーしてD3セルに張り付け Sub Macro1() Range("B3:B163").Select Selection.Copy Range("D3").Select ActiveSheet.Paste End Sub するとこんなマクロになりますよね コピー元はB3:B163固定なのでこのままで問題ないですよね、簡略化して Range("B3:B163").Copy で、貼り付け先はB1セルの日付を参照して求めるわけですが D2セル以降連番で日付が入力されている場合 C3セルの位置を基準にB1セルの数値分列を右に移動となるわけなので Range("D3").Select の部分を Cells(3, 3 + Range("B1")).Select または Range("C3").Offset(0, Range("B1")).Select として貼り付け先を指定 で、結果 Sub Macro1() Range("B3:B163").Copy Cells(3, 3 + Range("B1")).Select ActiveSheet.Paste End Sub こんな感じとか Sub Macro1() Range("B3:B163").Copy Range("C3").Offset(0, Range("B1")).Select ActiveSheet.Paste End Sub こんな感じ Sub Macro1() Range("B3:B163").Select Selection.Copy Selection.Offset(0, 1 + Range("B1")).Select ActiveSheet.Paste End Sub こんな感じでも同じ動作になりますね

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

作業するシートのマクロに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Range("B2:B164").Copy Cells(2, Cells(1, 2).Value + 3).PasteSpecial Application.CutCopyMode = False End If End Sub でいかがですか。 B1が変更されるたびに実行されます。 ちなみに 敷居の高い→ハードルが高い 【敷居が高い】 不義理や不面目のため、訪問しにくくなる

  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.1

こういう掲示板によくある現象ですが、質問がややこしすぎて読みこなすのが大変です! 答えを書くのも結構面倒です。 技術評論社、大村あつしさんの「かんたんプログラミング Excel2007 VBA 基礎編」のようなやさしい本で勉強してから、小さいマクロからこつこつとやっていったらいいんじゃないでしょうか。 あと、Excelの質問はmoug掲示板がおすすめです。

関連するQ&A