- 締切済み
Excelマクロで罫線をひきたい。
Access2000からエクスポートした結果のExcel2000のワークシートに、線をひきたいんです。 一番最初のセルはa1と決まっているけど、一番最後のセルは毎回変わってしまうのですが、 このセルを取得するためにはどんなマクロボタンを作成すればいいでしょうか? ただ本来の希望としては、マクロボタンひとつで、並べ替え>セルの変更>罫線、としたいのですけれど。 「セルの変更」というのは、エクスポートしたデータで「ランク」という項目があり、 これに「特・A・B」という項目があります。 Access上はひとつのフィールドにまとまっているのですが、Excel上では、それぞれ「特・A・B」という列を作成し、データがあったら、「○」を入れるというようにしたいのです。 (列が増えることになります。) また「備考1・備考2」がAccess上にあり、これは別フィールドとなっていますが、 今度はExcel上で「備考」としてひとつの列にしたいのです。 (列の減少) 別シートを作成してもかまいません。 このようなことはできるのでしょうか? せめて罫線だけでもひければ、と思います。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- nishi6
- ベストアンサー率67% (869/1280)
少々長くなっています。 この処理の考えるところは、Accessの出力シートにはマクロを書き込みづらいことです。 簡単にするために、処理用のシートを作ってみました。 処理用シートの内容 1.新規Bookを開きシートを1枚のみにする。これに結果を書きます。 2.標準モジュールに下記コードをコピーして貼り付けます。 (ツール→マクロ→Visual basic Editor で挿入→標準モジュール) このBookは何回でも使えるように別名で保存しておきます。 使用方法は 3.Access2000からエクスポートしたシートをこのBookにコピーします。 4.ツール→マクロ→マクロ で『表の整形』を実行します。 質問に書かれていることは取りあえず全てできているはずです。 罫線はCurrentRegionでセル範囲を求め、Bordersコレクションを操作しています。 ソートは例としてA、B列で行っています。書き換えて下さい。 (Excel2000) ここから(標準モジュールにコピーして貼り付けます) Sub 表の整形() '*** シート構造を検証 If Worksheets.Count <> 2 Then MsgBox "シート枚数が処理要件に合致していません。中止します" Exit Sub Else If Worksheets(1).Name = "変更後" Then Worksheets(2).Activate Else Worksheets(1).Activate End If End If 'シートを変数に代入 Dim ws1 As Worksheet 'ワークシート(Accessから出したシート) Dim ws2 As Worksheet 'ワークシート(罫線を引くシート) Set ws1 = ActiveSheet Set ws2 = Worksheets("変更後"): ws2.Range("A1").CurrentRegion.Clear Dim rw As Long '行カウンタ Dim col1 As Integer '列カウンタ1 Dim col2 As Integer '列カウンタ2 Dim hd As String 'セルの値(表題) Dim dt As String 'セルの値(データ) Dim Biko1, Biko2 As Integer '備考1,2の場所 Application.ScreenUpdating = False '*** 表題部分を書き込む *** With ws1 col2 = 0 col1 = 1: hd = .Cells(1, col1) While hd <> "" If hd <> "備考2" Then If hd = "ランク" Then '特・A・Bの分離 col2 = col2 + 1: ws2.Cells(1, col2) = "特" col2 = col2 + 1: ws2.Cells(1, col2) = "A" col2 = col2 + 1: ws2.Cells(1, col2) = "B" ElseIf hd = "備考1" Then '備考欄は備考1のみ使う col2 = col2 + 1: ws2.Cells(1, col2) = "備考" Biko1 = col1 Else col2 = col2 + 1: ws2.Cells(1, col2) = .Cells(1, col1) End If Else Biko2 = col1 End If col1 = col1 + 1: hd = .Cells(1, col1) Wend End With '*** データ部分を書き込む *** With ws1 For rw = 2 To ws1.Range("A65536").End(xlUp).Row col2 = 0 col1 = 1: hd = .Cells(1, col1) While hd <> "" dt = .Cells(rw, col1) If hd <> "備考2" Then If hd = "ランク" Then Select Case dt '特・A・Bの分離 Case "特": ws2.Cells(rw, col2 + 1) = "○" Case "A": ws2.Cells(rw, col2 + 2) = "○" Case "B": ws2.Cells(rw, col2 + 3) = "○" End Select col2 = col2 + 3 ElseIf hd = "備考1" Then '備考1、2を結合 col2 = col2 + 1 ws2.Cells(rw, col2) = _ .Cells(rw, col1) & .Cells(rw, col1 + Biko2 - Biko1) Else col2 = col2 + 1 ws2.Cells(rw, col2) = .Cells(rw, col1) End If End If col1 = col1 + 1: hd = .Cells(1, col1) Wend Next End With '*** 変更したシートを選択 *** ws2.Activate: Range("A1").Select ActiveCell.CurrentRegion.Select '*** ソート *** 列A、Bの例 Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("B2"), Order2:=xlAscending, Header:=xlYes '*** 罫線を引く(Bordersコレクション) *** Dim ks As Integer 'カウンタ For ks = 7 To 12 'xlEdgeLeft から xlInsideHorizontal With Selection.Borders(ks) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Next ws2.Range("A1").Select Application.ScreenUpdating = True End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 罫線はこんな感じかな? Sub Test() For i = 7 To 12 ActiveSheet.UsedRange.Borders(i).LineStyle = 1 Next i End Sub 「ランク」フィールドは、データが入ったままで列をコピーし、それぞれの列で○に置換えた後に、○以外を消す処理でいけると思います。 マクロを記録し、書きかえると良いですよ。
- imogasi
- ベストアンサー率27% (4737/17069)
質問の趣旨を理解できない点が有りますが、 下記道具立てが役に立ちますでしょうか。ご参考に。 (列の削除)F列の例 Columns("F:F").Select Selection.Delete Shift:=xlToLeft 削除する前に、文字列情報が入っているときは&で結合し残す列にまとめる。 例 Cells(3,3)=Cells(3,3) & Cells(3,4) C列とD列の文字列内容を結合してC列へセット。 (罫線を引く) Range(Cells(1,3),Cells(3,5)).Select With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With WeightでxlThin=細線、xlThick=太線 xlEdgeRight=セルの右側辺、xlEdgeTop=セルの上辺、 xlEdgeBottom=セルの底辺、xlEdgeLeft=セルの左辺 消す時= Selection.Borders(xlEdgeLeft).LineStyle = xlNone (罫線を引く最下行の取得) c=Range("a1").CurrentRegion.Rows.Count (最右列の取得) d=Range("a1").CurrentRegion.Columns.Countなど。 (ソート) Range("A1:C6").Select Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin End Sub ソートの条件を変えてマクロの記録を取って、どこがどのように変わるか見てください。 (マクロボタンひとつで) コマンドボタンをシートに貼りつけ、ダブルクリックし Private Sub CommandButton1_Click() End Sub の間にVBAでプログラムを書く。
- coco1
- ベストアンサー率25% (323/1260)
マクロボタン、というよりも、罫線を引くにあたって、末尾セルのアドレスを取得する方法、ということですね? counta()関数でデータが記録された列数と行数を取得すれば、cells()やindirect()関数で最終セルが計算できるはずです。 作業セルを作ればわかりやすいと思います。 罫線を引く手順については操作を記録させればいいのでそれほど難しくはないと思います。 わかりにくければ、補足を要求してください。
お礼
回答ありがとうございます。 >counta()関数でデータが記録された列数と行数を取得すれば、cells()やindirect()関数で最終セルが計算できるはずです。 すいません、これはどのようにやったらよいのでしょうか? マクロというかVBAですと「Range」とかでセルの位置を取得しますよね? そんな感じでできるのでしょうか?