[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『別ファイルへ罫線を引くVBA』(梨)
こんばんは。
別ファイルへへ罫線を引くVBAを教えてほしいです。
ダイアルボックスで指定するファイルを開き、
マクロが入っているファイルのシートを別ファイルへコピーして貼り付けています。
貼り付けるまでは出来たのですが、その先の罫線を引くVBAが上手くいきません。
コードは
Dim wbSaki As Workbook
CreateObject("Wscript.shell").currentdirectory = "C:\Users\u51633020\Desktop\リスト"
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
Set wbSaki = Workbooks.Open(Path & SetFile) If OpenFileName <> "False" Then SetFile = OpenFileName fileName = Dir(OpenFileName) Workbooks.Open fileName:=SetFile, ReadOnly:=True, UpdateLinks:=0
Set wbSaki = Workbooks.Open(Path & SetFile) wbSaki.Worksheets(1).Copy After:=wbSaki.Worksheets(1) '開いたワークシートの右隣にコピー
'線を引く
Dim MR As Long Dim MC As Long
'MR = .Cells(Rows.Count, 1).End(xlUp).Row 'MC = .Cells(8, Columns.Count).End(xlToLeft).Column 'Range(.Cells(8, 2), .Cells(MR, MC)).Borders.LineStyle = True
wbSaki.Save wbSaki.Close False 'マスターデータ取り込み先のファイルを閉じ End If これで行っても引けませんでした。 希望はB7を起点にB列の最終行から文字が入っている最終列までの間を引きたいです
お願いします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
ご参考。
https://www.google.com/search?q=vba+%E7%BD%AB%E7%B7%9A%E3%82%92%E5%BC%95%E3%81%8F
(わからん) 2022/04/28(木) 18:51
以下の様に設定しました。
Dim MR As Long Dim MC As Long With wbSaki.Worksheets(1) MR = .Cells(Rows.Count, 1).End(xlUp).Row MC = .Cells(8, Columns.Count).End(xlToLeft).Column Range(.Cells(8, 2), .Cells(MR, MC)).Borders.LineStyle = True End With wbSaki.Save wbSaki.Close False 'マスターデータ取り込み先のファイルを閉じ End If Range(.Cells(8, 2), .Cells(MR, MC)).Borders.LineStyle = TrueでRangeクラスは失敗しました。 WorkSheetオブジェクトととでました。
(梨) 2022/04/28(木) 20:16
エラーになったとき「wbSaki」には何が入っていたのですか?
(提示するなら、Sub〜End Subまで提示いただいたほうがお互いの誤解がなくてよいとおもいます。)
(もこな2) 2022/04/28(木) 20:29
Dim OpenFileName, fileName, Path, SetFile As String Dim wwbSaki As Workbook
CreateObject("Wscript.shell").currentdirectory = "C:\Users\linki\Desktop\出庫リスト"
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If OpenFileName <> "False" Then SetFile = OpenFileName fileName = Dir(OpenFileName) Workbooks.Open fileName:=SetFile, ReadOnly:=True, UpdateLinks:=0
Set wbSaki = Workbooks.Open(Path & SetFile)
'線を引く
Dim MR As Long Dim MC As Long With wbSaki.Worksheets(1) MR = .Cells(Rows.Count, 1).End(xlUp).Row MC = .Cells(8, Columns.Count).End(xlToLeft).Column Range(.Cells(8, 2), .Cells(MR, MC)).Borders.LineStyle = True End With wbSaki.Save wbSaki.Close False 'マスターデータ取り込み先のファイルを閉じ End If
End Sub
wbSakiはローカルウインドウで確認した所、何も入っていませんでした。
てっきり読み込んだファイル名が入っているかと思いました。
(梨) 2022/04/28(木) 20:39
こちらを修正してみてください。
Range(.Cells(8, 2), .Cells(MR, MC)).Borders.LineStyle = True ↓ .Range(.Cells(8, 2), .Cells(MR, MC)).Borders.LineStyle = True
(わからん) 2022/04/28(木) 21:49
Private Sub CommandButton2_Click() Dim OpenFileName, fileName, Path, SetFile As String Dim wwbSaki As Workbook CreateObject("Wscript.shell").currentdirectory = "C:\Users\linki\Desktop\出庫リスト"
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 'ダイアログボックスを表示して、マスターデータファイルを指定します。
If OpenFileName <> "False" Then SetFile = OpenFileName fileName = Dir(OpenFileName)
Application.CutCopyMode = False
Workbooks.Open fileName:=SetFile, ReadOnly:=False, UpdateLinks:=0
Set wbSaki = Workbooks.Open(Path & SetFile)
wbSaki.Worksheets(1).Copy After:=wbSaki.Worksheets(1) wbSaki.Worksheets(2).Range("B7:B700,M7:M200,N7:N200,P7:P200,Q7:Q200,R7:R200,AE7:AE200").ClearContents
Dim wb3 As Workbook Dim LstRow3 As Long Dim LstRow4 As Long
Set wb3 = ThisWorkbook
LstRow3 = wb3.Worksheets("転送シート").Cells(Rows.Count, 1).End(xlUp).Row wb3.Worksheets("転送シート").Range("O2:O600" & LstRow3).Copy Set ws = wbSaki.Worksheets(2) LstRow4 = ws.Cells(Rows.Count, 2).End(xlUp).Row + 1 ws.Range("B" & LstRow4).PasteSpecial xlPasteValues
Application.CutCopyMode = False
Set ws = wbSaki.Worksheets(2) '線を引く
Dim MR As Long Dim MC As Long
MR = ws.Cells(Rows.Count, 2).End(xlDown).Row MC = ws.Cells(8, Columns.Count).End(xlToLeft).Column ws.Range(ws.Cells(8, 2), ws.Cells(MR, MC)).Borders.LineStyle = True wbSaki.Save wbSaki.Close
Application.DisplayAlerts = True Application.ScreenUpdating = True End If
End Sub で行うと線は引かれました。 しかし、なぜか文字が入っているセルの最終セルは転送シートのO列は146行目なのですが ctrl+↓で試すとなぜか163行目の空白セルになってしまいます。それを最終行と判断して線が引かれると思います。文字が入っているセルを最終行と判断させることはできますでしょうか?
この動作の前に
Worksheets("転送シート").Range("A2:A700").Copy
Worksheets("転送シート").Range("O2:O700").PasteSpecial Paste:=xlPasteValues を行っているのですが、これは数式が入っている転送シートA列の値を同じ転送シートのO列に値のみ貼り付けているのですが、実際A列に数式が163行まで入っています。 これがなにか関係しているのですか? (梨) 2022/04/29(金) 07:42
ご参考。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1478773794
(わからん) 2022/04/29(金) 08:04
参照のページをみて解決できました。
アドバイスありがとうございました。
(梨) 2022/04/29(金) 08:19
直接関係しませんが、気づいた点があります。
Workbooks.Open fileName:=SetFile, ReadOnly:=False, UpdateLinks:=0 Set wbSaki = Workbooks.Open(Path & SetFile) と2回開いているのはおかしくないですか?
またSetFileは既にドライブ、フォルダ名がついているのに、Pathを追加するのは不思議。
Pathは宣言しただけで値をセットしていないので影響はないが、無駄と思います。
また、インデントをきちんとつける習慣をつけたほうが、ご自分のためによいと思いますよ。
(γ) 2022/04/29(金) 08:41
Workbooks.Open fileName:=SetFile, ReadOnly:=False, UpdateLinks:=0
Set wbSaki = Workbooks.Open(Path & SetFile) は2回開いているとご指摘がありましたが そうするとどちらかが不要とのことでしょうか?
Pathの方は訂正させてもらいます。
(梨) 2022/04/29(金) 09:29
提示おつかれさまでした。全体を拝見して何点か。
■1
Dim OpenFileName, fileName, Path, SetFile As String ↑のような書き方はダメではありませんが↓のように解釈されます。 Dim OpenFileName As Variant, fileName As Variant, Path As Variant, SetFile As String
よって慣れてきたら↓のように適切な型を指定できるようになるとよいですね。
Dim OpenFileName As String, fileName As String, Path As String, SetFile As String
■2
エクセル君の忖度で想定通り動きはするでしょうが、「OpenFileName」がVariant型である場合
If OpenFileName <> "False" Then
↑は↓のようにしたほうが良いでしょう。
If OpenFileName <> False Then
また、好みの問題ではありますが
If 〜〜〜〜〜〜〜〜〜 処理 End If
よりも、
If 〜〜〜〜〜〜〜 条件を満たしたら処理中止 処理
という書き方にしたほうが可読性が上がるように思います。
■3
「Application.GetOpenFilename」はそれ単体でファイルの【フルパス】を得ることができます。
そして↓でファイル名だけ取り出していますが、どこで使っているわけでもありません。
fileName = Dir(OpenFileName)
なのでさっくりと削除してよろしいかとおもいます。
また、変数「Path」は値の取得をしている箇所がないので「""」のままです。
したがって↓は
Set wbSaki = Workbooks.Open(Path & SetFile) Set wbSaki = Workbooks.Open(SetFile)
↑と同じことになります。
そして↓のようになっているのですから、【同じファイルを2度開く】ことになっています。
Workbooks.Open fileName:=SetFile, ReadOnly:=True, UpdateLinks:=0 Set wbSaki = Workbooks.Open(SetFile)
この部分はエラーにはなりませんが、無駄な工程であるようにおもいます。
■4
>wbSakiはローカルウインドウで確認した所、何も入っていませんでした。
何も入ってないのではなく、「Dim wbSaki As Workbook」ですから、【開いたブック】がセットされていたのではありませんか?
[2022/04/28(木) 20:16]に提示された情報だけだと、その部分が見えなかったので「wbSaki」が空っぽ(Nothing)のままなのに操作しようとしたことがエラーの原因と考えて確認した次第です。
■5
>希望はB7を起点にB列の最終行から文字が入っている最終列
そうであれば↓はおかしいです。
Range(.Cells(8, 2), .Cells(MR, MC)).Borders.LineStyle = True ↑ ここ
また、↓も正しく取得できているのか少々気がかりです
MR = .Cells(Rows.Count, 1).End(xlUp).Row MC = .Cells(8, Columns.Count).End(xlToLeft).Column
「MR」は【A列の】最終行を求めてますし、「MC」は【8行目の】最終列を求めています。
■6
ということを踏まえて「2022/04/28(木) 20:44」のコードを整理してみるとこんな感じでしょうか。
興味があれば、【ステップ実行】して研究してみてください
Sub 研究用() Dim ファイルパス As String Dim wbSaki As Workbook
Stop 'ブレークポイントの代わり
CreateObject("Wscript.shell").currentdirectory = "C:\Users\linki\Desktop\出庫リスト" ファイルパス = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If ファイルパス <> "False" Then Set wbSaki = Workbooks.Open(fileName:=ファイルパス, ReadOnly:=True, UpdateLinks:=0) Else Exit Sub End If
With wbSaki.Worksheets(1) MR = .Cells(.Rows.Count, 1).End(xlUp).Row MC = .Cells(8, .Columns.Count).End(xlToLeft).Column .Range("B7", .Cells(MR, MC)).Borders.LineStyle = True End With
wbSaki.Save wbSaki.Close False End If
(もこな2) 2022/04/29(金) 10:17
(γ) 2022/04/30(土) 08:45
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.