- 締切済み
Excelでの罫線のみのコピーについて
エクセルのVBAを使って罫線のみのコピーコマンドを作ろうかと考えています。選択範囲をForEachで、Selectionループをかけてとりあえず配列にパラメーターを取り込み、同じくループで、Rangeに貼り付けようと考えました。が、3次元配列の動的割り当てが上手く行きません。(ローカルウィンドで見ると、配列が定義されていませんが、エラーも出ません)何故でしょうか?どなたか教えて頂けないでしょうか?また、そんな方法よりも、こうした方がいいよ!!ってのがありましたら教えて頂けないでしょうか?宜しくお願いします。 Dim MyLine() As Variant Dim I As Integer ReDim MyLine(Selection.Count, 3, 2) I = 0 For Each myrang In Selection MyLine(I, 0, 0) = myrang.Borders(xlEdgeTop).LineStyle '上端 MyLine(I, 0, 1) = myrang.Borders(xlEdgeTop).Weight '上端 MyLine(I, 0, 2) = myrang.Borders(xlEdgeTop).ColorIndex '上端 I = I + 1 Next とりあえず上端のみを載せました。実際によ全てのパラメータを配列に取り込むつもりなので、3次元にしています。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
雛形に表示形式・配置・フォント・罫線など、全ての書式を設定して、 書式のみコピー&ペーストするのでは、だめなのでしょうか? '#3のリンク先をちょっといじっただけの罫線のみのコピーコマンド Sub test() Dim myrang As Range 'In Selection コピー元 Dim rng As Range '貼り付け先 Dim b As Border '一本の罫線 Dim i As Integer, j As Integer 'ループ用 '貼り付け先のシートと左上セルを指定 Set rng = Sheets(2).Range("b2") With Selection Set rng = rng.Resize(.Rows.Count, .Columns.Count) End With i = 1 For Each myrang In Selection '罫線1本ずつ処理(斜め罫線含む) '上下左右だけなら j = xlEdgeLeft To xlEdgeRight 'または j = 7 to 10(#1の回答を参照) For j = xlDiagonalDown To xlEdgeRight Set b = myrang.Borders(j) If b.LineStyle <> xlNone Then '「罫線なし」でないなら With rng.Cells(i).Borders(j) '貼り付け先に罫線設定 .Weight = b.Weight .ColorIndex = b.ColorIndex .LineStyle = b.LineStyle End With End If Next j i = i + 1 Next myrang End Sub
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんなサンプルがありました。参考になると思います。 ■参考ページ 後段の記事番号 E03M121 にある kBorderCopyPaste 関数です。 http://homepage2.nifty.com/kmado/ke_m13.htm フレーム切れの案内で申し訳ありません TOP ページは下記です。 ■TOPページ http://homepage2.nifty.com/kmado/
- imogasi
- ベストアンサー率27% (4737/17069)
なんで難しい途を選ぶのだろう。 別シートにコピーして、編集ークリアー数式と値およびコメント の操作をマクロの記録をとれば良いのでは。 エクセルVBAであって、VBではないのだから、もっとエクセルの操作のことも絡んで、良い方法はないか勉強ないし質問をすべきです。 3次元配列を考えるなんて、素人的な発想をすぐ言語の仕様(できるという知識を得て)に短絡させたものだと思う。VBAの解説本を読めば判るように、普通はエクセルVBAの課題では、全く使われていない。 配列そのものもシートのセル(およびシート群)が、見方によっては配列的なので、シート(群)対象にはほとんど必要ない。 罫線Borderはセルの4辺などに8つもあり、Borders,Borderaroundもあり、罫線属性としてスタイルや太さ色もあり、セルごとに元シートのセルのそれらを個別に取得して、別シートに再現するのはコード上複雑になると思う。 プログラムするとき、発想(ロジック)が我流でないか反省するのが大切でしょう。
- fumufumu_2006
- ベストアンサー率66% (163/245)
とりあえず、 >ローカルウィンドで見ると、配列が定義されていませんが、エラーも出ません は、ちゃんと配列は定義されているみたいです。 >ReDim MyLine(Selection.Count, 3, 2) は、ReDim MyLine(Selection.Count-1, 3, 2)の方が美しいです。(0から始めているので) それと、せっかく変数の宣言をしているのだから、Dim myrang As Range も宣言した方がいいと思います。 先頭に、Option Explicit を入れると、煩わしいけど、予想外のエラーが減ります。 本題に戻って、 >3次元配列の動的割り当てが上手く行きません。 3次元配列は必要ないと思います。 記憶する変数の型をBordersにすれば、以下になります。 Dim b() As Borders Dim i As Integer Dim myrang As Range ReDim b(Selection.Count - 1) i = 0 For Each myrang In Selection Set b(i) = myrang.Borders i = i + 1 Next ただし、コピー先のセルのbordersを設定する時は、セル.Borders=??の形はできないみたいです。(やってみた限りですが) 設定する時は、1セルについて、 with cells(?,?).Borders(xlEdgeTop) .LineStyle=b(?).Borders(xlEdgeTop).LineStyle .Weight =b(?).Borders(xlEdgeTop).Weight .ColorIndex =b(?).Borders(xlEdgeTop).ColorIndex end with with cells(?,?).Borders(xlEdgeBottom) ... end with with cells(?,?).Borders(xlEdgeRight) ... end with with cells(?,?).Borders(xlEdgeLeft) ... end with と言う作業が必要です。 でも、 xlEdgeLeft = 7 xlEdgeTop = 8 xlEdgeBottom = 9 xlEdgeRight = 10 なので、変数でループさせるとコードが短くなります。
お礼
ご丁寧なご指導有難う御座います。 変数でループの点など大いに参考にしたいと思います。 Dim b() As Bordersについては、構造体でしょうか?大変参考になりました。仰るとおり、取得だけでも、構造体の形がとれれば簡素化できますね!!でも、設定が出来ないなんて、不便ですね?? Option Explicit は入れています。コードが抜粋なので、転写し忘れました。今後とも宜しくお願い致します。
補足
VBAでやろうとしたのには、理由があって、表の中でカット&ペーストを繰り返すと、表の罫線がぐちゃぐちゃになってしまいます。単純にシートを使ってのコピペすると、もとからあったデータが上書きされてしまい消えてしまいます。そこで、一々手動で罫線を直していると時間がかかるので、マクロで、雛形の罫線のみを複写しようかと考えました。 imogasiさんのアドバイスを参考に逆に、一度雛形をTmpシートに複写して、それに、元のシートのセルの値、数式、コメントなどをコピーした後に、元のシートに上書きする方法を考えて見ます。 何かご忠告があれば、指導願います。