- 締切済み
エクセルのマクロで、知恵をお貸しください。
エクセルのマクロで、知恵をお貸しください。 A1 A2 A3 A4 A5にあるオートシェイプ(矢印) → → → → → を範囲選択で、 (1)B1以降横につなげるマクロは、できますか。 →→→→→ (2)B1とB2に交互に(列は重ねず)並べるマクロは、可能でしょうか。 → → → → →
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- hallo-2007
- ベストアンサー率41% (888/2115)
出来るだけわかりやすいコードにしたつもりですが 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)
>を範囲選択で、 参考に セル範囲選択で(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
- hallo-2007
- ベストアンサー率41% (888/2115)
>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から順にひとつづつ増えていきます。 オートシャイプの数と同じになったら終わりになります。
補足
ありがとうございます。 No2の解答の方は、願った動きをしましたが選択行だけをできないものでしょうか。 No3の解答の方は、申し訳ありませんが、No2を2行のなかで、交互に表示させたいのです。 ---→→→→→--→-→→→--→ 上記を下記にしなければならないのです。 ---→ → → -→ → → → --→ → --→ 難しい質問にお付き合いいただき、感謝します。 できれば、よろしく、お願いいたします。
- hallo-2007
- ベストアンサー率41% (888/2115)
>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)
マクロの記録でダメでしょうか? (1) マクロの記録の開始 A1:A5 を選択、コピィ B1を選択、値を選択して貼り付け、ウィザードの右下の 行列を入れ替え にチェックをいれてOK マクロの記録の終了 (2) 同様ですが マクロの記録の開始 A1:A5 を選択、コピィ B1を選択、値を選択して貼り付け、ウィザードの右下の 行列を入れ替え にチェックをいれてOK C1を下へ移動、E1を下へ移動 マクロの記録の終了 行数が多数あるのであれば、For~Next文で繰り返し実行させます。
補足
すいません、質問内容が、不足していました。 行数が一定していないのですが、どう記録できますでしょうか。 For~Next文が、初心者であまり理解できていません。 A1からA5を、B1とB2へ A6からA9を、B6とB7へ A10からA17を、B10とB11へ移動させたいのです。
補足
みなさん、ありがとうございます。 Test1 シェイプの長さが違うと、挙動がおかしくなります。 Test2 なぜか動きません。