[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『条件にあったシートを各ファイルから探して印刷したい。』(すず)
すいません、仕様の変更を言われて、困ってしまい、質問させてもらいました。
ファイルはすべて同じフォルダにおきます。ファイル名は、
入力ファイルの
入力
と、データファイルの
100、200、…1000
です。
100〜1000ファイルに印刷したいシートがあります。
例えば、100なら、
シート名は、101〜199が、
200なら、
シート名は201〜299
といったかんじで作成されています。
この各シートの印刷範囲は、A1〜DF43です。
また、CF1、CJ1、CO1、CX1セルには、
入力ファイルのsheet1にある
組、番、氏、名のデータが反映されるようにしたいです。
つまり、組のB3〜B100が、CF1に
番のC3〜C100が、CJ1に
氏のD3〜D100が、CO1に、
名のE3〜E100が、CX1にです。
F2、G2、…には、各データ内のシート名が入力されています、つまり、
101、102、…1098,1099
です。
入力ファイルのsheet1のA1セルにマクロボタンを作成したいです。
そこで、欲しい動作は、入力ファイルのマクロボタンをクリックしたら、
?@3行目のF3、G3、…のデータを参照して、空白なら無視。
1が入力されていたら、それに対応するシートを選ぶ。
つまり、105と207にだけ1が入力されていたら、
ファイル名100の105シートと、ファイル名200の207シートを印刷する。
?A?@の印刷時には、上記のように組、番、氏、名が反映される。
?B3行目の印刷が終わったら、4行目に移って印刷。
?C入力ファイルのB,C列にデータがなくなったら、マクロ終了。
です。
よろしくお願いいたします。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
(もこな2) 2021/08/16(月) 10:40
とりあえず、質問とは関係ないですが何点か。
■1
この掲示板では丸付き数字などの環境依存文字は使わないほうがいいですよ。
(環境によっては文字化けしちゃうので)
■2
質問掲示板で提示のあったコードやネットで見つけたコードを研究するには【ステップ実行】という方法が便利ですよ。
ステップ実行という言葉を聞いたことがなければ↓を読んでみてください。
【ステップ実行】 https://www.239-programing.com/excel-vba/basic/basic023.html http://plus1excel.web.fc2.com/learning/l301/t405.html
また、以下も知っておいて損は無いと思います。
【イミディエイトウィンドウ】 https://www.239-programing.com/excel-vba/basic/basic024.html https://excel-ubara.com/excelvba1/EXCELVBA486.html
【ローカルウィンドウ】 https://excel-ubara.com/excelvba4/EXCEL266.html http://excelvba.pc-users.net/fol8/8_2.html
【ブレークポイント】 https://www.239-programing.com/excel-vba/basic/basic022.html https://www.tipsfound.com/vba/01010
■3
ということで、もしも以前に提示されたコードをベースに改良を加えたいということなら、まずそのコードの研究から始めてみてはどうでしょうか?
(もこな2) 2021/08/16(月) 11:50
ちょっと笑ってしまった。
(ごめんなさい。) 2021/08/16(月) 12:05
教えていただいたURL、見て試してみようと思います。
すいません。
(すず) 2021/08/16(月) 17:34
200の場合は? (通りすがり) 2021/08/16(月) 17:44
参考まで。
Sub test()
Dim num(5) As Integer Dim i As Integer num(0) = 100 num(1) = 101 num(2) = 109 num(3) = 200 num(4) = 201 num(5) = 209 For i = 0 To 5 MsgBox num(i) & vbCrLf & Int(num(i) / 100) Next i End Sub (通りすがり) 2021/08/16(月) 17:48
まず必要な処理を分解して考えると
入力ファイルの???シートのF3セルから順番に右にみていき、もしも、1が立っているセルがあったら (1)2行目の【セルの値】から、必要なシートが格納されているブック名を調べる (2)↑のブックを開く (3)該当のシートを印刷する (4)ほかに印刷が必要なシートがないか順番にチェックする (5)n番台がなくなったら(他に印刷の必要なシートがないことが確定したら)(1)のブック を閉じる
ですよね。
まずは、印刷はさておきブックを開くところを考えてみましょう
■5
既に回答のあるところですが、シート名からブック名を調べるには、百の単位未満を切り捨てれば計算で求めることができますよね。
よってこんな感じです
Sub 研究01()
Dim i As Long
With ActiveSheet
For i = 6 To .Cells(2, .Columns.Count).End(xlToLeft).Column
If .Cells(3, i).Value = 1 Then
MsgBox .Cells(2, i).Value & "シートは" & vbLf & Int(.Cells(2, i).Value / 100) * 100 & ".xls にあります"
End If
Next
End With
End Sub
■6
そして、ブックは全部同じフォルダにあるということですから、ファイル(ブック)のプルパスは、【マクロが書いてあるブックが存在するフォルダパス】と【ブック名】
を組み合わせればよいですよね。
よって、こんな風にすればよいです。
Sub 研究02()
Dim ブックパス As String
ブックパス = ThisWorkbook.Path & "\" & "ブック名"
MsgBox "↓を開けばおk" & vbLf & ブックパス
End Sub
■7
ここまでで、開く必要があるブックのフルパスを調べることができましたので実際にブックを開いてみましょう。
ブックを開く命令は、【マクロの記録】を使うと調べることができます。
まずはこの辺りまで作ってみてはどうでしょうか?
※初めから複数のシート、ブックを対象にしようとすると混乱すると思うので、 まずは1シート(1ブック)のみで考えることをお勧めします。
(もこな2) 2021/08/16(月) 19:17
>F2、G2、…には、各データ内のシート名が入力されています、つまり、
>101、102、…1098,1099
>です。
(きまぐれ) 2021/08/17(火) 10:30
私は、3桁や4桁入力してでも103とか1034とか、必要な数字を入力した方が、対応する列に1を入力するよりいいと思ったのですが、やはりそう思われますか。
(すず) 2021/08/17(火) 11:26
通りすがり さん の ご質問にお答えいただいていれば 今頃、解決していたかもですね。。。^^; 100、200、300 〜 1000 というシート名は無いのでしょうか。 え (・。・; シート名ですよ。。。ね。↑ 1099。。。(#^^#) (隠居Z) 2021/08/17(火) 12:28
ということだったのです。
質問をちゃんと理解できていない、ということでしょうか。
(すず) 2021/08/17(火) 13:07
>>質問をちゃんと理解できていない、ということでしょうか。
いえ、決して。。。
私が、ご提示の内容を私の理解不足により掌握できていなかったという
意味で御座います。m(__)m
もう一つ教えて頂きたいのですが
印刷範囲がとても横に広範囲なのですが。一部を印刷エリアに
指定しておられるのでしょうか。それともページ分、枚数を
印刷で?。。。^^;。← ちょっと気になったもので。
入力ブック[入力.xlsm] Sheet1
想像図
違っていましたら、相違点を教えて下さい。
|[A]|[B]|[C] |[D] |[E] |[F] |[G]
[1] | | | | | | |
[2] | |組 |番 |氏 |名 |シート名|印刷標識
[3] | | 1|10001|あ1 |む1 | 393| 1
[4] | | 2|10002|あ2 |む2 | 716| 1
[5] | | 3|10003|あ3 |む3 | 228| 1
[6] | | 4|10004|あ4 |む4 | 330| 1
[7] | | 5|10005|あ5 |む5 | 220| 1
[8] | | 6|10006|あ6 |む6 | 417| 0
[9] | | 7|10007|あ7 |む7 | 348| 0
[10] | | 8|10008|あ8 |む8 | 895| 1
[11] | | 9|10009|あ9 |む9 | 461| 0
[12] | | 10|10010|あ10|む10| 975| 1
[13] | | 11|10011|あ11|む11| 944| 1
[14] | | 12|10012|あ12|む12| 214| 1
[15] | | 13|10013|あ13|む13| 825| 1
[16] | | 14|10014|あ14|む14| 264| 1
[17] | | 15|10015|あ15|む15| 293| 0
[18] | | 16|10016|あ16|む16| 904| 0
[19] | | 17|10017|あ17|む17| 904| 1
[20] | | 18|10018|あ18|む18| 840| 0
[21] | | 19|10019|あ19|む19| 663| 0
[22] | | 20|10020|あ20|む20| 739| 0
[23] | | 21|10021|あ21|む21| 957| 0
[24] | | 22|10022|あ22|む22| 227| 0
[25] | | 23|10023|あ23|む23| 631| 1
[26] | | 24|10024|あ24|む24| 817| 1
[27] | | 25|10025|あ25|む25| 406| 1
[28] | | 26|10026|あ26|む26| 583| 0
[29] | | 27|10027|あ27|む27| 954| 1
[30] | | 28|10028|あ28|む28| 177| 1
[31] | | 29|10029|あ29|む29| 989| 0
[32] | | 30|10030|あ30|む30| 589| 0
[33] | | 31|10031|あ31|む31| 660| 1
[34] | | 32|10032|あ32|む32| 848| 0
[35] | | 33|10033|あ33|む33| 671| 0
[36] | | 34|10034|あ34|む34| 788| 1
[37] | | 35|10035|あ35|む35| 362| 1
[38] | | 36|10036|あ36|む36| 145| 1
[39] | | 37|10037|あ37|む37| 527| 1
[40] | | 38|10038|あ38|む38| 279| 1
[41] | | 39|10039|あ39|む39| 112| 1
[42] | | 40|10040|あ40|む40| 529| 0
[43] | | 41|10041|あ41|む41| 572| 0
[44] | | 42|10042|あ42|む42| 493| 0
[45] | | 43|10043|あ43|む43| 131| 1
[46] | | 44|10044|あ44|む44| 828| 1
[47] | | 45|10045|あ45|む45| 884| 1
[48] | | 46|10046|あ46|む46| 123| 0
[49] | | 47|10047|あ47|む47| 733| 1
[50] | | 48|10048|あ48|む48| 508| 0
[51] | | 49|10049|あ49|む49| 703| 1
[52] | | 50|10050|あ50|む50| 807| 1
[53] | | 51|10051|あ51|む51| 837| 1
[54] | | 52|10052|あ52|む52| 981| 0
[55] | | 53|10053|あ53|む53| 438| 0
[56] | | 54|10054|あ54|む54| 697| 1
[57] | | 55|10055|あ55|む55| 739| 1
[58] | | 56|10056|あ56|む56| 944| 0
[59] | | 57|10057|あ57|む57| 639| 1
[60] | | 58|10058|あ58|む58| 106| 0
[61] | | 59|10059|あ59|む59| 903| 0
[62] | | 60|10060|あ60|む60| 976| 0
[63] | | 61|10061|あ61|む61| 149| 0
[64] | | 62|10062|あ62|む62| 498| 1
[65] | | 63|10063|あ63|む63| 704| 1
[66] | | 64|10064|あ64|む64| 172| 0
[67] | | 65|10065|あ65|む65| 242| 1
[68] | | 66|10066|あ66|む66| 333| 1
[69] | | 67|10067|あ67|む67| 143| 1
[70] | | 68|10068|あ68|む68| 919| 1
[71] | | 69|10069|あ69|む69| 142| 1
[72] | | 70|10070|あ70|む70| 207| 0
[73] | | 71|10071|あ71|む71| 688| 1
[74] | | 72|10072|あ72|む72| 304| 1
[75] | | 73|10073|あ73|む73| 648| 1
[76] | | 74|10074|あ74|む74| 436| 0
[77] | | 75|10075|あ75|む75| 682| 1
[78] | | 76|10076|あ76|む76| 460| 0
[79] | | 77|10077|あ77|む77| 588| 1
[80] | | 78|10078|あ78|む78| 484| 1
[81] | | 79|10079|あ79|む79| 376| 0
[82] | | 80|10080|あ80|む80| 321| 1
[83] | | 81|10081|あ81|む81| 474| 0
[84] | | 82|10082|あ82|む82| 316| 0
[85] | | 83|10083|あ83|む83| 251| 1
[86] | | 84|10084|あ84|む84| 332| 0
[87] | | 85|10085|あ85|む85| 370| 1
[88] | | 86|10086|あ86|む86| 592| 0
[89] | | 87|10087|あ87|む87| 182| 1
[90] | | 88|10088|あ88|む88| 468| 1
[91] | | 89|10089|あ89|む89| 739| 0
[92] | | 90|10090|あ90|む90| 259| 1
[93] | | 91|10091|あ91|む91| 440| 0
[94] | | 92|10092|あ92|む92| 249| 1
[95] | | 93|10093|あ93|む93| 533| 1
[96] | | 94|10094|あ94|む94| 976| 0
[97] | | 95|10095|あ95|む95| 730| 1
[98] | | 96|10096|あ96|む96| 390| 0
[99] | | 97|10097|あ97|む97| 663| 1
[100]| | 98|10098|あ98|む98| 567| 0
(隠居Z) 2021/08/17(火) 13:24
|[A]|[B]|[C] |[D] |[E] |[F] |[G] |[H]
[1] | | | | | | | |
[2] | |組 |番 |氏 |名 |シート名1|シート名2|シート名3 … シート名50
[3] | | 1|10001|あ1 |む1 | 103 | 104 |
[4] | | 2|10002|あ2 |む2 | 101 | 103 |
[5] | | 3|10003|あ3 |む3 | 228 | 502 |
[6] | | 4|10004|あ4 |む4 | 330 | 333 |
[7] | | 5|10005|あ5 |む5 | 220 | 601 |
[8] | | 6|10006|あ6 |む6 | 417 | |
[9] | | 7|10007|あ7 |む7 | 348 | 812 |
[10] | | 8|10008|あ8 |む8 | 895 | 702 |
[11] | | 9|10009|あ9 |む9 | 461 | 501 |
[12] | | 10|10010|あ10|む10| 975 | 989 | [13] | | 11|10011|あ11|む11| 944 | 1
その人毎に印刷を要するシートが違っていて、0枚とか、2枚とか、5枚とかです。
必要とするシート名を必要なだけ入力するようにした方が無駄が少なそうなきがしました。
何度もありがとうございます。
(すず) 2021/08/17(火) 14:31
Sub 研究03()
Dim 行 As Long, 列 As Long, i As Long
Dim ブック名 As String
With ThisWorkbook.Worksheets("Sheet1")
For 行 = 3 To .Cells(.Rows.Count, "B").End(xlUp).Row
For 列 = 6 To .Cells(行, .Columns.Count).End(xlToLeft).Column
ブック名 = Int(.Cells(行, 列).Value / 100) * 100 & ".xlsx"
MsgBox "もしも「" & ブック名 & "」が開いてなかったら" & vbLf & ThisWorkbook.Path & "\" & ブック名 & "を開く"
MsgBox "必要な転記をしたら「" & .Cells(行, 列).Value & "」シートを印刷する"
Next 列
Next 行
End With
For i = 100 To 1100 Step 100
MsgBox "もしも「" & i & "」ブックが開いていたら閉じる"
Next i
End Sub
(もこな2) 2021/08/17(火) 15:05
(もこな2) 2021/08/17(火) 16:01
それが理解できれば、あとは繰り返しの世界なので・・・
(もこな2) 2021/08/17(火) 17:05
とりあえず 作ってみましたが。。。^^
自信ありません。きっと、もっとスマートで
完成度の高いコードが有ると思いますが
何とか動きますので、ご考察時の参考にでも。。。^^;
ブック読み込むだけで、10秒はかかるかも。。。
なんとか、コーヒータイムの間に印刷へ回せるかも。みたいな感じです
私もここの生徒なので
突っ込み大歓迎ですぅ〜 (#^ ^#)v
シート名の確認は付けましたが、エラー処理等、ありません
Option Explicit
Sub OneInstanceMain03()
Const zProgramID As String = "入力.xlsm"
Dim zTb As Workbook
Dim i As Long
Dim j As Long
Dim n As Long
Dim nn As Long
Dim lr As Long
Dim lc As Long
Dim mcol() As Variant
Dim invflg As Boolean
Dim v() As Variant
Dim sNm() As Variant
Dim zErr() As Variant
Dim kumi As Long
Dim ban As Long
Dim lNm As String
Dim fNm As String
Dim r As Range
Dim zD As Object
Dim wBnm() As Variant
Dim vAr As Variant
Dim t As Double
t = Timer
Set zTb = Workbooks(zProgramID)
Set zD = CreateObject("Scripting.Dictionary")
With zTb.Worksheets("Sheet1")
lr = .Cells(.Rows.Count, 2).End(xlUp).Row
For i = 3 To lr
ReDim Preserve mcol(j)
mcol(j) = .Cells(i, .Columns.Count).End(xlToLeft).Column
j = j + 1
Next
lc = Application.Max(mcol)
Set r = .Range(.Cells(3, 2), .Cells(lr, lc))
v = r.Value
End With
For i = LBound(v, 1) To UBound(v, 1)
kumi = v(i, 1)
ban = v(i, 2)
lNm = v(i, 3)
fNm = v(i, 4)
For j = 5 To UBound(v, 2)
If v(i, j) <> Empty Then
If sNmAndNumchk(v(i, j)) Then
ReDim Preserve sNm(n)
sNm(n) = Array(v(i, j), Int(v(i, j) / 100) * 100 & ".xlsx", _
kumi, ban, lNm, fNm)
n = n + 1
zD(Int(v(i, j) / 100) * 100 & ".xlsx") = Empty
Else
ReDim Preserve zErr(nn)
zErr(nn) = r(i, j).Address(0, 0)
nn = nn + 1
invflg = True
End If
End If
Next
Next i
If invflg Or zD.Count = 0 Then
bclose zTb
zD.RemoveAll
MsgBox "情報に不都合が有りました修正後再起動してください" & Chr(13) & Join(zErr, Chr(13))
Erase v, wBnm, sNm, zErr, mcol
Exit Sub
End If
wBnm = zD.keys
'Application.ScreenUpdating = False
For Each vAr In wBnm
If Dir(zTb.Path & "\" & vAr) <> "" Then
Workbooks.Open zTb.Path & "\" & vAr
End If
Next
'Application.ScreenUpdating = True
For i = LBound(sNm) To UBound(sNm)
j = 2
With Workbooks(sNm(i)(1)).Worksheets(Trim(CStr(sNm(i)(0))))
For Each vAr In Union(.Range("cf1"), .Range("cj1"), .Range("co1"), .Range("cx1"))
vAr.Value = sNm(i)(j)
j = j + 1
Next
With .PageSetup
.Orientation = xlLandscape
.PaperSize = xlPaperB4
'.Zoom = 70
End With
.PrintPreview
End With
DoEvents
Next
bclose zTb
Erase v, wBnm, sNm, zErr, mcol
zD.RemoveAll
MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
Private Sub bclose(ByVal wb As Workbook)
Dim vAr As Workbook
For Each vAr In Workbooks
If Not (wb Is vAr) Then
vAr.Close False
End If
Next
End Sub
Private Function sNmAndNumchk(ByRef arg1 As Variant) As Boolean
Dim i As Long
Dim vAr As Variant
For i = 1 To Len(arg1)
If Mid(arg1, i, 1) Like "[0-9]" Then
sNmAndNumchk = True
Else
sNmAndNumchk = False
Exit Function
End If
Next
If arg1 > 100 And arg1 < 1100 Then
sNmAndNumchk = True
Else
sNmAndNumchk = False
Exit Function
End If
For Each vAr In Array(200, 300, 400, 500, 600, 700, 800, 900, 1000)
If arg1 = vAr Then
sNmAndNumchk = False
Exit Function
End If
Next
End Function
(隠居Z) 2021/08/18(水) 11:52
.PrintPreview を.PrintOut に変えました。
すると、プレビューで止まらず、つながっていないプリンターにデーターを送っているみたいでした。
ただ、関係ないフォルダにフィアルを保存しようとしていました。???
それから、最後に
Private Sub zAcceptSe(ByRef startnum As Long, ByRef endnum As Long)
Dim a As Variant
Dim b As Variant
a = Application.InputBox("開始する組と番を数値で入力して下さい", "開始組&番", "11", , , , , 1)
If TypeName(a) = "Boolean" Then End
startnum = a
b = Application.InputBox("終了する組と番を数値で入力して下さい", "終了組&番", "13", , , , , 1)
If TypeName(a) = "Boolean" Then End
endnum = b
End Sub
を入れれば、開始の組番と終了の組番を指定できるかと思ったのですが、浅はかでした。
何度も申し訳ないのですが、前回と同じというわけではないのですね。
すいません。
よろしくお願いいたします。
(すず) 2021/08/18(水) 18:43
こんばんは ^^ >>関係ないフォルダにフィアルを保存 一切保存はしていません どうせ毎回、書き換える箇所の変更のみなので保存せず ブックを閉じています。 シート名の有る行と同じ行のB〜E列の 組、番、氏、名 を書き込んでいます。Previwでご確認を。 小さくて見えない場合は、虫メガネマークをクリックすれば 大きく表示されますよ。 違っていましたら、今一度、正解を、教えて下さい。。。A^^; m(_ _)m (隠居Z) 2021/08/18(水) 19:44
とにかくありがとうございます。
(すず) 2021/08/18(水) 20:14
>>開始の組番と終了の組番を指定できるかと思ったのですが、浅はかでした。 >>前回と同じというわけではないのですね。 相済みません。。。思い出しました。私の方が迂闊だったようです。 前回同様、併用出来るようにしてみます。 B、C列の組、番 は以前と比較して 横並びが、縦並びに変わっただけですよね。←違っていれば教えて下さいね。 暫時御猶予を m(_ _)m (隠居Z) 2021/08/18(水) 21:23
いつもありがとうございます。
(すず) 2021/08/19(木) 05:26
おはようございます ^^
一応組み込んでは見ましたが。。。いい加減な手抜きロジックにつき
不都合が有るやもしれません。
VBAもかなり精通しておられるようなので,現在のコードを全てご理解の上
将来は、ユーザーフォームに切替、きちんと4項目[開始組、番、終了組、番]
に分け処理された方がいいかも。。。
Sheet1 B列、C列の優先順位で、昇順に組と番が並んでいて、抜け[空]
が無い事が前程です。
3行目以降B〜E列まで情報が有る列ならどこにシート名を入力して戴いても
取り込みます。← 多分。。。( ̄▽ ̄)
ブック名判定は 通りすがり さん のご提案を使わせて戴きました。m(__)m
エラー処理、便利機能等は御座いません。でわ
m(_ _)m
Option Explicit
Sub 印刷検索付v01()
Const zProgramID As String = "入力.xlsm"
Dim zTb As Workbook
Dim i As Long
Dim j As Long
Dim n As Long
Dim nN As Long
Dim lR As Long
Dim lC As Long
Dim sKb As Long
Dim eKb As Long
Dim sRow As Long
Dim eRow As Long
Dim mCol() As Variant
Dim iNvflg As Boolean
Dim v() As Variant
Dim sNm() As Variant
Dim zErr() As Variant
Dim kUmi As Long
Dim bAn As Long
Dim lNm As String
Dim fNm As String
Dim r As Range
Dim zD As Object
Dim wBnm() As Variant
Dim vAr As Variant
Dim t As Double
t = Timer
zAcceptSe sKb, eKb
Set zTb = Workbooks(zProgramID)
Set zD = CreateObject("Scripting.Dictionary")
With zTb.Worksheets("Sheet1")
lR = .Cells(.Rows.Count, 2).End(xlUp).Row
For i = 3 To lR
ReDim Preserve mCol(j)
mCol(j) = .Cells(i, .Columns.Count).End(xlToLeft).Column
j = j + 1
Next
lC = Application.Max(mCol)
Set r = .Range(.Cells(3, 2), .Cells(lR, lC))
v = r.Value
End With
For i = LBound(v, 1) To UBound(v, 1)
If sKb = v(i, 1) & v(i, 2) Then sRow = i
If eKb = v(i, 1) & v(i, 2) Then eRow = i
Next
If sRow < 1 Then
sRow = 1
eRow = 0
End If
For i = sRow To eRow
kUmi = v(i, 1)
bAn = v(i, 2)
lNm = v(i, 3)
fNm = v(i, 4)
For j = 5 To UBound(v, 2)
If v(i, j) <> Empty Then
If sNmAndNumchk(v(i, j)) Then
ReDim Preserve sNm(n)
sNm(n) = Array(v(i, j), Int(v(i, j) / 100) * 100 & ".xlsx", _
kUmi, bAn, lNm, fNm)
n = n + 1
zD(Int(v(i, j) / 100) * 100 & ".xlsx") = Empty
Else
ReDim Preserve zErr(nN)
zErr(nN) = r(i, j).Address(0, 0)
nN = nN + 1
iNvflg = True
End If
End If
Next
Next i
If iNvflg Or zD.Count = 0 Then
bClose zTb
zD.RemoveAll
MsgBox "情報に不都合が有りました修正後再起動してください" & Chr(13) & Join(zErr, Chr(13))
Erase v, wBnm, sNm, zErr, mCol
Exit Sub
End If
wBnm = zD.keys
For Each vAr In wBnm
If Dir(zTb.Path & "\" & vAr) <> "" Then
Workbooks.Open zTb.Path & "\" & vAr
End If
Next
For i = LBound(sNm) To UBound(sNm)
j = 2
With Workbooks(sNm(i)(1)).Worksheets(Trim(CStr(sNm(i)(0))))
For Each vAr In Union(.Range("CF1"), .Range("CJ1"), .Range("CO1"), .Range("CX1"))
vAr.Value = sNm(i)(j)
j = j + 1
Next
With .PageSetup
.Orientation = xlLandscape
.PaperSize = xlPaperB4
'.Zoom = 70
End With
.Range("A1:DF43").PrintPreview
End With
DoEvents
Next
bClose zTb
Erase v, wBnm, sNm, zErr, mCol
zD.RemoveAll
MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
Private Sub bClose(ByVal wb As Workbook)
Dim vAr As Workbook
For Each vAr In Workbooks
If Not (wb Is vAr) Then
vAr.Close False
End If
Next
End Sub
Private Function sNmAndNumchk(ByRef arg1 As Variant) As Boolean
Dim i As Long
Dim vAr As Variant
For i = 1 To Len(arg1)
If Mid(arg1, i, 1) Like "[0-9]" Then
sNmAndNumchk = True
Else
sNmAndNumchk = False
Exit Function
End If
Next
If arg1 > 100 And arg1 < 1100 Then
sNmAndNumchk = True
Else
sNmAndNumchk = False
Exit Function
End If
For Each vAr In Array(200, 300, 400, 500, 600, 700, 800, 900, 1000)
If arg1 = vAr Then
sNmAndNumchk = False
Exit Function
End If
Next
End Function
Private Sub zAcceptSe(ByRef startnum As Long, ByRef endnum As Long)
Dim a As Variant
Dim b As Variant
a = Application.InputBox("開始する組と番を数値で入力して下さい", "開始組&番", "11", , , , , 1)
If TypeName(a) = "Boolean" Then End
startnum = a
b = Application.InputBox("終了する組と番を数値で入力して下さい", "終了組&番", "13", , , , , 1)
If TypeName(a) = "Boolean" Then End
endnum = b
End Sub
(隠居Z) 2021/08/19(木) 09:38
本当にありがとうございます。
(すず) 2021/08/19(木) 10:07
はい それで、仮に番が10001なら 110001 1組の10001番で。行けるはずです。単純に組と番を繋いでるだけなので A^^; m(_ _)m (隠居Z) 2021/08/19(木) 10:15
★1
話が続くようであれば↓のようなコードが完成するはずでした。
Sub 完成予定()
Dim 行 As Long, 列 As Long, i As Long
Dim ブック名 As String
Dim WB As Workbook
Dim dstSH As Worksheet
With ThisWorkbook.Worksheets("Sheet1")
For 行 = 3 To .Cells(.Rows.Count, "B").End(xlUp).Row
For 列 = 6 To .Cells(行, .Columns.Count).End(xlToLeft).Column
ブック名 = Int(.Cells(行, 列).Value / 100) * 100 & ".xlsx"
On Error Resume Next
Set WB = Nothing
Set WB = Workbooks(ブック名)
On erro GoTo 0
If WB Is Nothing Then Workbooks.Open (ThisWorkbook.Path & "\" & ブック名)
Set dstSH = Workbooks(ブック名).Worksheets(.Cells(行, 列).Value)
dstSH.Range("CF1") = .Cells(行, "B").Value
dstSH.Range("CJ1") = .Cells(行, "C").Value
dstSH.Range("CO1") = .Cells(行, "D").Value
dstSH.Range("CX1") = .Cells(行, "E").Value
dstSH.PrintPreview
Next 列
Next 行
End With
On Error Resume Next
For i = 100 To 1100 Step 100
Workbooks(i & ".xlsx").Close False
Next i
On Error GoTo 0
End Sub
★2
ただ、上記ですと、99シートあるブックが最大で11個開きっぱなしになってしまうので、隠居Zさんの「2021/08/17(火) 13:24」のレイアウトを参考に再考。
Sub 再考バージョン()
Dim 行 As Long, 列 As Long, 出力行 As Long
Dim ブック名 As String
Dim WB As Workbook
Dim dstSH As Worksheet
With Worksheets.Add(After:=ThisWorkbook.Worksheets(Worksheets.Count))
.Name = "作業用"
End With
With ThisWorkbook.Worksheets("Sheet1")
.Range("B2:F2").Copy Worksheets("作業用").Range("A1")
出力行 = 2
For 行 = 3 To .Cells(.Rows.Count, "B").End(xlUp).Row
For 列 = 6 To .Cells(行, .Columns.Count).End(xlToLeft).Column
.Cells(行, "B").Resize(, 4).Copy Worksheets("作業用").Cells(出力行, "A")
.Cells(行, 列).Copy Worksheets("作業用").Cells(出力行, "E")
出力行 = 出力行 + 1
Next 列
Next 行
Worksheets("作業用").Range("A1").CurrentRegion.Sort Key1:=Range("E1"), Order1:=xlAscending, Header:=xlYes
End With
With ThisWorkbook.Worksheets("作業用")
For 行 = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
ブック名 = Int(.Cells(行, "E").Value / 100) * 100 & ".xlsx"
On Error Resume Next
Set WB = Nothing
Set WB = Workbooks(ブック名)
If WB Is Nothing Then Workbooks.Open (ThisWorkbook.Path & "\" & ブック名)
On Error GoTo 0
With Workbooks(ブック名).Worksheets(.Cells(行, "E").Value & "")
.Range("CF1").Value = ThisWorkbook.Worksheets("作業用").Cells(行, "A").Value
.Range("CJ1").Value = ThisWorkbook.Worksheets("作業用").Cells(行, "B").Value
.Range("CO1").Value = ThisWorkbook.Worksheets("作業用").Cells(行, "C").Value
.Range("CX1").Value = ThisWorkbook.Worksheets("作業用").Cells(行, "D").Value
.PrintPreview
End With
If ブック名 <> Int(.Cells(行 + 1, "E").Value / 100) * 100 & ".xlsx" Then
Workbooks(ブック名).Close False
End If
Next 行
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
End Sub
このようにすれば11個も開きっぱなしになりませんね。
いずれも、混乱するといけませんから、隠居Zさんとのやり取りが終わって、時間に余裕があって、興味がわいたときに研究してみてください。
(もこな2) 2021/08/20(金) 14:27
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.