• 締切済み

エクセルのマクロで、知恵をお貸しください。

エクセルのマクロで、知恵をお貸しください。 A1 A2 A3 A4 A5にあるオートシェイプ(矢印)  →  →  →  →  → を範囲選択で、 (1)B1以降横につなげるマクロは、できますか。   →→→→→ (2)B1とB2に交互に(列は重ねず)並べるマクロは、可能でしょうか。   → → →    → →

みんなの回答

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

出来るだけわかりやすいコードにしたつもりですが RETUという変数とGYOUという変数が順番(変数 i が増えるごと)に変わっていきます。 Sub Test3() For i = 1 To ActiveSheet.Shapes.Count RETU = i GYOU = i - Int(i / 2) * 2 If GYOU = 0 Then GYOU = 2 Cells(i, 1).Cut Cells(GYOU, RETU) Next End Sub で試してみてください。 iが1から順に増えていくので、その時のGYOUとRETUの値がどの様に変わるか一度、手計算で表にでもしてみてください。 原理がわかると思います。必要であれば応用してください。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>を範囲選択で、 参考に セル範囲選択で(1)の動作 Sub Test1()   Dim Sh As Shape, i As Long   Dim myRang As Range   Set myRang = Selection   i = 1   For Each Sh In ActiveSheet.Shapes     With Sh       If Not Intersect(myRang, .TopLeftCell) Is Nothing Then         i = i + 1         .Left = Cells(1, i).Left + (Cells(1, i).Width - .Width) / 2         .Top = Cells(myRang.Row, 1).Top + (Cells(myRang.Row, 1).Height / 2)       End If     End With   Next End Sub セル範囲選択で(2)の動作 Sub Test2()   Dim Sh As Shape, i As Long   Dim myRang As Range, myR As Long   Set myRang = Selection   i = i + 1   For Each Sh In ActiveSheet.Shapes     With Sh       If Not Intersect(myRang, .TopLeftCell) Is Nothing Then         i = i + 1         .Left = Cells(1, i).Left + (Cells(1, i).Width - .Width) / 2         myR = i Mod 2         .Top = Cells(myRang.Row + myR, 1).Top + (Cells(myRang.Row + myR, 1).Height / 2)       End If     End With   Next End Sub

ranaruheaven1
質問者

補足

みなさん、ありがとうございます。 Test1 シェイプの長さが違うと、挙動がおかしくなります。 Test2 なぜか動きません。

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

>A1からA5を、B1とB2へ >A6からA9を、B6とB7へ >A10からA17を、B10とB11へ移動させたいのです。 を勝手に A1をB1へ、A2からA5をB2へ A6をB6へ、A7からA9をB7へ A10をB10へ、A11からA17をB11へ移動させたいのです。 と解釈して Sub Test2() For i = 1 To ActiveSheet.Shapes.Count RETU = 2 GYOU = i If i - Int((i - 1) / 5) * 5 > 2 Then GYOU = 2 + Int((i - 1) / 5) * 5 Cells(i, 1).Cut Cells(GYOU, RETU) Next End Sub 状況に合わせてRETUとGYOUの式を変えて使ってください。 変数 i は1から順にひとつづつ増えていきます。 オートシャイプの数と同じになったら終わりになります。

ranaruheaven1
質問者

補足

ありがとうございます。 No2の解答の方は、願った動きをしましたが選択行だけをできないものでしょうか。 No3の解答の方は、申し訳ありませんが、No2を2行のなかで、交互に表示させたいのです。 ---→→→→→--→-→→→--→ 上記を下記にしなければならないのです。 ---→ → →   -→ →    → → --→  → --→ 難しい質問にお付き合いいただき、感謝します。 できれば、よろしく、お願いいたします。

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

>A1からA5を、B1とB2へ 5つセルにあるオートシェイプを2つのセルに? 補足説明がまだ必要な気がします。 とりあえず、For文の使い方として参考コードを提示しておきます。 もちろん、新しいブックでテスト用に作動させてみてください。 Sub Test1() For i = 1 To ActiveSheet.Shapes.Count Cells(i, 1).Cut Cells(1, 1 + i).Select ActiveSheet.Paste Next End Sub

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

マクロの記録でダメでしょうか? (1) マクロの記録の開始 A1:A5 を選択、コピィ B1を選択、値を選択して貼り付け、ウィザードの右下の 行列を入れ替え にチェックをいれてOK マクロの記録の終了 (2) 同様ですが マクロの記録の開始 A1:A5 を選択、コピィ B1を選択、値を選択して貼り付け、ウィザードの右下の 行列を入れ替え にチェックをいれてOK C1を下へ移動、E1を下へ移動 マクロの記録の終了 行数が多数あるのであれば、For~Next文で繰り返し実行させます。

ranaruheaven1
質問者

補足

すいません、質問内容が、不足していました。 行数が一定していないのですが、どう記録できますでしょうか。 For~Next文が、初心者であまり理解できていません。 A1からA5を、B1とB2へ A6からA9を、B6とB7へ A10からA17を、B10とB11へ移動させたいのです。

関連するQ&A