
エクセルの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件)
- 最新から表示
- 回答順に表示
No.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
No.3
- 回答日時:
こんなサンプルがありました。
参考になると思います。■参考ページ
後段の記事番号 E03M121 にある kBorderCopyPaste 関数です。
http://homepage2.nifty.com/kmado/ke_m13.htm
フレーム切れの案内で申し訳ありません TOP ページは下記です。
■TOPページ
http://homepage2.nifty.com/kmado/
No.2
- 回答日時:
なんで難しい途を選ぶのだろう。
別シートにコピーして、編集ークリアー数式と値およびコメント
の操作をマクロの記録をとれば良いのでは。
エクセルVBAであって、VBではないのだから、もっとエクセルの操作のことも絡んで、良い方法はないか勉強ないし質問をすべきです。
3次元配列を考えるなんて、素人的な発想をすぐ言語の仕様(できるという知識を得て)に短絡させたものだと思う。VBAの解説本を読めば判るように、普通はエクセルVBAの課題では、全く使われていない。
配列そのものもシートのセル(およびシート群)が、見方によっては配列的なので、シート(群)対象にはほとんど必要ない。
罫線Borderはセルの4辺などに8つもあり、Borders,Borderaroundもあり、罫線属性としてスタイルや太さ色もあり、セルごとに元シートのセルのそれらを個別に取得して、別シートに再現するのはコード上複雑になると思う。
プログラムするとき、発想(ロジック)が我流でないか反省するのが大切でしょう。
この回答への補足
VBAでやろうとしたのには、理由があって、表の中でカット&ペーストを繰り返すと、表の罫線がぐちゃぐちゃになってしまいます。単純にシートを使ってのコピペすると、もとからあったデータが上書きされてしまい消えてしまいます。そこで、一々手動で罫線を直していると時間がかかるので、マクロで、雛形の罫線のみを複写しようかと考えました。
imogasiさんのアドバイスを参考に逆に、一度雛形をTmpシートに複写して、それに、元のシートのセルの値、数式、コメントなどをコピーした後に、元のシートに上書きする方法を考えて見ます。
何かご忠告があれば、指導願います。
No.1
- 回答日時:
とりあえず、
>ローカルウィンドで見ると、配列が定義されていませんが、エラーも出ません
は、ちゃんと配列は定義されているみたいです。
>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 は入れています。コードが抜粋なので、転写し忘れました。今後とも宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) VBA 罫線について B列3行目から21行毎にデータがはいります。 データがはいったらデータが入った 6 2022/11/15 17:22
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excel2003 罫線だけを保護したい
-
Excelの外枠太罫線を2~3倍さ...
-
罫線の色を薄くしたい
-
エクセル 入力されていない線...
-
【エクセル】謎の枠線の消し方
-
EXCELで、下線の太さを変...
-
エクセルのアンダーラインについて
-
罫線の色をまとめて変更する
-
パワーポイントで、表の一部を...
-
vba セルの罫線について教えて...
-
エクセル表の罫線(縦)が消せ...
-
Wordで表のセル幅を超えたら次...
-
Excelの条件付き書式設定の太い...
-
Excel カメラ機能でセル...
-
Excel:罫線を固定で残しておく...
-
図形の挿入でコネクタ:カギ線...
-
エクセル の縦線
-
エクセル2016で、セル全てが消...
-
エクセルで文字を入力すると罫...
-
EXCELのオートフィルタで罫線が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excel2003 罫線だけを保護したい
-
Excelの条件付き書式設定の太い...
-
Excelの外枠太罫線を2~3倍さ...
-
EXCELで、下線の太さを変...
-
罫線の色を薄くしたい
-
【エクセル】謎の枠線の消し方
-
エクセルで文字を入力すると罫...
-
エクセル 入力されていない線...
-
エクセルで罫線も一緒に並び替...
-
EXCELのオートフィルタで罫線が...
-
エクセル の縦線
-
エクセルのアンダーラインについて
-
パワーポイントで、表の一部を...
-
決まった罫線のなかで、文章入...
-
エクセル
-
エクセル表の罫線(縦)が消せ...
-
罫線が引かれているセルの個数...
-
OpenOfficeのCalcで罫線の削除...
-
Excelでアンダーラインに文字が...
-
<EXCEL>ページ最後の行の罫線...
おすすめ情報