アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルの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次元にしています。

A 回答 (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
    • good
    • 2

こんなサンプルがありました。

参考になると思います。

■参考ページ
後段の記事番号 E03M121 にある kBorderCopyPaste 関数です。
http://homepage2.nifty.com/kmado/ke_m13.htm

フレーム切れの案内で申し訳ありません TOP ページは下記です。
■TOPページ
http://homepage2.nifty.com/kmado/
    • good
    • 0

なんで難しい途を選ぶのだろう。


別シートにコピーして、編集ークリアー数式と値およびコメント
の操作をマクロの記録をとれば良いのでは。
エクセルVBAであって、VBではないのだから、もっとエクセルの操作のことも絡んで、良い方法はないか勉強ないし質問をすべきです。
3次元配列を考えるなんて、素人的な発想をすぐ言語の仕様(できるという知識を得て)に短絡させたものだと思う。VBAの解説本を読めば判るように、普通はエクセルVBAの課題では、全く使われていない。
配列そのものもシートのセル(およびシート群)が、見方によっては配列的なので、シート(群)対象にはほとんど必要ない。
罫線Borderはセルの4辺などに8つもあり、Borders,Borderaroundもあり、罫線属性としてスタイルや太さ色もあり、セルごとに元シートのセルのそれらを個別に取得して、別シートに再現するのはコード上複雑になると思う。
プログラムするとき、発想(ロジック)が我流でないか反省するのが大切でしょう。

この回答への補足

VBAでやろうとしたのには、理由があって、表の中でカット&ペーストを繰り返すと、表の罫線がぐちゃぐちゃになってしまいます。単純にシートを使ってのコピペすると、もとからあったデータが上書きされてしまい消えてしまいます。そこで、一々手動で罫線を直していると時間がかかるので、マクロで、雛形の罫線のみを複写しようかと考えました。
imogasiさんのアドバイスを参考に逆に、一度雛形をTmpシートに複写して、それに、元のシートのセルの値、数式、コメントなどをコピーした後に、元のシートに上書きする方法を考えて見ます。
何かご忠告があれば、指導願います。

補足日時:2008/01/04 00:42
    • good
    • 0

とりあえず、


>ローカルウィンドで見ると、配列が定義されていませんが、エラーも出ません
は、ちゃんと配列は定義されているみたいです。
>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
なので、変数でループさせるとコードが短くなります。
    • good
    • 0
この回答へのお礼

ご丁寧なご指導有難う御座います。
変数でループの点など大いに参考にしたいと思います。
Dim b() As Bordersについては、構造体でしょうか?大変参考になりました。仰るとおり、取得だけでも、構造体の形がとれれば簡素化できますね!!でも、設定が出来ないなんて、不便ですね??
Option Explicit は入れています。コードが抜粋なので、転写し忘れました。今後とも宜しくお願い致します。

お礼日時:2008/01/04 00:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A