[[20170209153443]] 『別シートからデータの抽出からの指定印刷』(yas) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『別シートからデータの抽出からの指定印刷』(yas)

プルダウンをきっかけにVLOOKUPで入力されたものを、一つ一つ印刷しているのですが、数が多くなり、まとめて印刷ができればと思っています。

[Sheet1]が印刷フォーム。
{Sheet2}がリスト。

[Sheet1のE2]をプルダウンにしています。
[Sheet1のE2]のデータは、{Sheet2のE列}において{TEXT(B列"_"C列)}としたものを使用しています。
({Sheet2のB列}は001からの+1で通番にしています)

=1=
[Sheet1のE2]でプルダウンをすることで、[Sheet1のB8]に{Sheet2のD6}および[Sheet1のF8]に{Sheet2のC6}が自動で入力されるようにしたい。
(今まではVLOOKUPでしていた)

=2=
その上で、フォームなどで開始番号/終了番号{Sheet2のB列}を指定して、その範囲分の印刷ができるようにしたい。

=2=ができれば、=1=の工程は不要なのかな、とも思っています。
(1枚だけでも印刷できるようであれば)

要領を得ない質問でしたらすみません。
よろしくお願いします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 >yasさん

 Sheet2のB列、C列、E列及び、Sheet1のE2を
 具体的に説明願います。
 ファイル名?、シート名?、セル範囲?

 Sheet1のE2のプルダウンとは、データ入力規則のリストですか?
 リストで、元の値のところに、=Sheet2!$E$2:$E$100
 みたいに設定してるとか??

 >その上で、フォームなどで開始番号/終了番号{Sheet2のB列}を
 >指定して、その範囲分の印刷ができるようにしたい。 

 Sheet1に、開始番号と終了番号を入れるとしたら、
 それぞれ、どこのセルを使用しますか?

 **************************************************************
 いまいち、よくわかりませんが、
 [Sheet1のE2]の値が変わったら、
 [Sheet1のB8]に{Sheet2のD6}および
 [Sheet1のF8]に{Sheet2のC6}が自動で入力されるようにしたい。
 を実現したいなら、
 ファイルの拡張子を(xlsm)にして保存した後、
 Sheet1のコード記述欄に、次をコピペしてみてください。

 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 Option Explicit

 Private Sub Worksheet_Change(ByVal target As Range)
    If target.Count > 1 Then Exit Sub
    If target.Address <> "$E$2" Then Exit Sub

    ThisWorkbook.Sheets("Sheet1").Range("B8") = _
    ThisWorkbook.Sheets("Sheet2").Range("D6")
    ThisWorkbook.Sheets("Sheet1").Range("F8") = _
    ThisWorkbook.Sheets("Sheet2").Range("C6")

 End Sub

(マリオ) 2017/02/09(木) 17:08


 >マリオさん

Sheet2の、B列、C列、E列は、列番号。
Sheet1のE2は、セル番地です。

[Sheet1のE2]には、仰る通り、入力規則のリストを当てていて、=Seet2!E6:E255としています。

いただいたコードを試しましたが、[Sheet1のB8]も[F8]も、空白のままでした。

そもそも、[Sheet1のE2]自体が、TEXT関数で{Sheet2のB列}と{C列}をくっつけて成り立っているものを引用していることが、データとして認識してもらえないということもあるのでしょうか。
(yas) 2017/02/09(木) 17:52


 >yas さん
 こちらで再現できるシート構成を教えてください。

 >Sheet2の、B列、C列、E列は、列番号。 
 具体性に欠けます。
 どのファイルのどのシートの列番号なのですか?
 例えば、Sheet2のB2,C2,E2セルには、どんな値が入っているのですか?
 
 >Sheet1のE2は、セル番地です。 
 具体性に欠けます。
 どのファイルのどのシートのセル番号なのですか?
 例えば、Sheet1のE2セルには、どんな値が入っているのですか?

 最終的に印刷したいのは、何なのですか?
 Sheet1の指定したセル範囲とか?
 外部のエクセルファイルの指定したセル範囲とか?

(マリオ) 2017/02/09(木) 18:10


マリオさん

今まで要領を得ない説明ですみませんでした。ご親切、ありがとうございます。
いただいた2つ目のファイルが、まさにやりたいことですが、そこに印刷を併せたいのです。

ファイル名:名簿
「リスト」シートと「印刷」シートで構成します。

【「リスト」シート】

    |[A] |[B]     |[C] |[D]                   
 [1]|番号|名前    |組  |                      
 [2]| 001|いちろう|つき|001_いちろう          
 [3]| 002|じろう  |ほし|002_じろう            
 [4]| 003|さぶろう|ゆき|003_さぶろう          
 [5]| 004|しろう  |もも|004_しろう            
 [6]| 005|ごろう  |うめ|=TEXT(A6,"000")&"_"&B6

【「印刷」シート】

    |[A]               
 [1]|001_いちろう      
 [2]|                  
 [3]|くみ              
 [4]|(自動で入力したい)
 [5]|なまえ            
 [6]|(自動で入力したい)

「印刷」シートのA1は、「リスト」シートのD2以降からプルダウンで選択します。
そうすると、最初の質問での=1=である、自動入力がされたい。

さらに=2=として、じろうからしろうまでを印刷したい。
その場合、「2」(じろうの番号)と「4」(しろうの番号)を指定するだけで、
「印刷」シートのA4、A6が、組も含めじろう、さぶろう、しろうになったものを印刷したい。
(印刷されるのはA3:A6のみ)

印刷範囲の指定は、「印刷」シートのセルへの入力+ボタンでも良いのですが、
可能であれば、メッセージボックスを表示させて指令する方法が好ましいです。
(スペースの関係)

始めからこのように説明すべきでした。
よろしくお願いします。

(yas) 2017/02/10(金) 10:41


 >yasさん

 >「印刷」シートのA1は、「リスト」シートのD2以降からプルダウンで選択します。 
 >そうすると、最初の質問での=1=である、自動入力がされたい。

 例えば、「印刷」シートのA1にて、
 プルダウンリストの「003_さぶろう」を選択したら、
 「印刷」シートのA4には、「ゆき」、
 「印刷」シートのA6には、「さぶろう」
 と自動入力したいってことでしょうか?

 ******************************************************************************
 >さらに=2=として、じろうからしろうまでを印刷したい。 
 >その場合、「2」(じろうの番号)と「4」(しろうの番号)を指定するだけで、 
 > 「印刷」シートのA4、A6が、組も含めじろう、さぶろう、しろうになったものを印刷したい。 
 >(印刷されるのはA3:A6のみ) 

 何を言っているのか、いまいちわかりません。
 「2」と「4」の数字を入れるのは、どのシートのどのセルでしょうか?
 「2」と「4」の数字を入れたら、「印刷」シートのA4、A6には、どんな値が入るのでしょうか?
 (印刷されるのはA3:A6のみ)とは、何を言っているのでしょうか?
 印刷プレビューすると、必ず、「印刷」シートのセル範囲「A3:A6」を表示するようにしたければ、
 表示tabに、改ページプレビューがあるので、そこで、設定すればいいと思いますが。
 印刷範囲は、「印刷」シートのセル範囲「A3:A6」固定でいいですか??
(マリオ) 2017/02/10(金) 13:17

 >yas さん
 目的は、名札を人数分、作成したいということでしょうか?
 添付ファイルのa2.xlsx【削除しました】
(マリオ) 2017/02/10(金) 15:08

 >マリオさん

1枚の紙に1人分だけ印刷できれば良いと思っています。
本来の目的物は、A4イッパイのフォームの中に、例でいう「組」と「名前」だけを変えたものを、人数分作成したいのです。

いただいたファイルを理解するのに少々時間をいただきたいのですが、その間に書いていたものを、念のため記載してみます。

1つ前にいただいたものへの回答です。

***

マリオさん

=1=の自動入力についてはその通りです。

=2=については、

 >「2」と「4」の数字を入れるのは、どのシートのどのセルでしょうか?

「2」と「4」の数字を入れるのは、
・「印刷」シートの空いているセルに入力して、ボタンで実行する方法。
仮にC2とD2とした場合は

    |[A]               |[B]|[C]     |[D]     
 [1]|001_いちろう      |   |開始番号|終了番号
 [2]|                  |   |   2   |  4      
 [3]|くみ              |   |   [実行ボタン]     
 [4]|(自動で入力したい)|   |        |        
 [5]|なまえ            |   |        |        
 [6]|(自動で入力したい)|   |        |        

もしくは、
・シート内ではなく、ボタンを押すと、別にメッセージボックスが出て「2」「4」を入力する方法。
(上の表C1:D3と同じような体裁)

 >「2」と「4」の数字を入れたら、「印刷」シートのA4、A6には、どんな値が入るのでしょうか?
「2」(=002)と「4」(=004)は、印刷をさせたいデータ範囲であるので、実際の見た目に変化はなくてよいのですが、=1=の考え方でいうと、
「2」と入れたらA4、A6にはじろうのデータである「ほし」「じろう」が入り
「4」と入れたらA4、A6にはしろうのデータである「もも」「しろう」が入ります。
印刷開始番号が「2」で印刷終了番号が「4」なので、間の「3」である「ほし」「さぶろう」も存在します。

 > (印刷されるのはA3:A6のみ)とは、何を言っているのでしょうか?
この部分を印刷フォームとして、印刷したいので、印刷範囲として「印刷」シートのA3:A6は固定します。
(固定で良いです)

1人分のデータを印刷するのであれば、「印刷」シートのA1のプルダウンから選択し、ただ単に印刷すればよいのですが、人数を多く印刷したい場合、一人ひとりデータをプルダウンから選択して印刷、を繰り返すのではなく、2番のじろうから4番のしろうまでをまとめて印刷することができるといいな、をしたいのです。

(yas) 2017/02/10(金) 15:47


 添付ファイルa1.xlsmについて
「リスト」シートと「印刷」シートの構成です。

 「リスト」シート
 ***********************************************
    |[A] |[B]     |[C] |[D]         
 [1]|番号|名前    |組  |            
 [2]| 001|いちろう|つき|001_いちろう
 [3]| 002|じろう  |ほし|002_じろう  
 [4]| 003|さぶろう|ゆき|003_さぶろう
 [5]| 004|しろう  |もも|004_しろう  
 [6]| 005|ごろう  |うめ|005_ごろう  
 ************************************************************
 「リスト」シートにて、「Ctrl+F3」すると、
 名前の管理ダイアロボックスが表示されるので、
 新規作成で、2つの名前を作成してください。
 (1)名前を「リスト1」、参照範囲を「=リスト!$D:$D」
 (2)名前を「リスト2」、参照範囲を「=リスト!$B:$D」
 ************************************************************
 「印刷」シートにて、A1セルを選択後に、データtabのデータ入力規則を選択
 →設定tabにて、入力値の種類を「リスト」、元の値を「=リスト1」
 にして、OKボタンを押してください。

 「印刷」シートのB4とB6セルには、
 次の数式の★右辺をそれぞれ、入れてください。
 B4=INDEX(リスト2,MATCH($A$1,リスト1,0),2)
 B6=INDEX(リスト2,MATCH($A$1,リスト1,0),1)
 B3は「くみ」、B5は「なまえ」の文字列を入れてください。
(マリオ) 2017/02/10(金) 16:08

 >マリオさま

添付ファイルa1については、理解しました!
念のため確認ですが、最後の段落のB4とB6は、A4とA6のことですよね?
A4とA6に入っている式も、理解しました。

このa1ファイルで、数名分をまとめた印刷指令を出して、一人ずつの分が「印刷」シートでプリントされることを希望しています。

私の理解と、いただいた情報の活用を、週末の間にもう少しがんばってみます!
(yas) 2017/02/10(金) 17:57


 >yasさん

 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
http://d.kuku.lu/cd9977d4fd
 添付ファイル(a4.xlsm)←これを試してみてください(最終版です)。
 「印刷」「入力」「名札」「リスト」の4シートで構成されています。
 「入力」シートに使い方が書いてますので、見てください。
 やりたいことに、近いですかね??
 プログラムで、名札シートの「A1:A4の書式」と「A1,A3の文字列」を使用しています。
  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

 >1枚の紙に1人分だけ印刷できれば良いと思っています。
 >本来の目的物は、A4イッパイのフォームの中に、
 >例でいう「組」と「名前」だけを変えたものを、人数分作成したいのです。

 >1人分のデータを印刷するのであれば、「印刷」シートのA1のプルダウンから選択し、
 >ただ単に印刷すればよいのですが、人数を多く印刷したい場合、
 >一人ひとりデータをプルダウンから選択して印刷、を繰り返すのではなく、
 >2番のじろうから4番のしろうまでをまとめて印刷することができるといいな、をしたいのです。

 やりたいことが、よくわかりました。

 >念のため確認ですが、最後の段落のB4とB6は、A4とA6のことですよね? 
 そうですね。A4とA6の間違いです。

 ***********************************************************************************
 マクロを使って、複数の名札(組の文字列、組、名前の文字列、名前)を
 「印刷」シートに作成して、それぞれの名札を別ページ(改ページ)に設定しています。

 添付ファイルa3.xlsmについて
 「リスト」、「名札」、「入力」、「印刷」のシート構成
 とModule1に記述したコードを下記に記述します。
 ***********************************************************************************
 「リスト」シート
    |[A] |[B]     |[C] 
 [1]|番号|名前    |組  
 [2]| 001|いちろう|つき
 [3]| 002|じろう  |ほし
 [4]| 003|さぶろう|ゆき
 [5]| 004|しろう  |もも
 [6]| 005|ごろう  |うめ

 ------------------------------------------

 「名札」シート
    |[A]     
 [1]|くみ    
 [2]|さくら  
 [3]|なまえ  
 [4]|渥美 清

 ※名札シート(行幅(A列)は74.13、行高(A1〜A4セル)は150)
 (フォントサイズ95、フォントはHGS明朝E)
 (細い罫線で囲んでいます(A1〜A4セル))

 ------------------------------------------

 「入力」シート
    |[A]   |[B]|[C]                                          
 [1]|開始行|  2|=LOOKUP(1,0/(リスト!A:A<>""),ROW(リスト!A:A))
 [2]|終了行|  5|                                             

 ※C1セルの数式は、リストシートのA列の最終行の値
 B1セルは、データの入力規則(ユーザ設定)で、
 =AND($B$1=INT($B$1),$B$1>=2)
 としています(2以上の整数)。
 また、
 B2セルは、データの入力規則(ユーザ設定)で、
 =AND($B$2=INT($B$2),$B$2>=$B$1,$B$2<=$C$1)
 としています(B1セルの値以上で、かつ、C1セルの値以下の整数)。

 また、C2セルには、フォームコントロールの「作成」ボタン
 D2セルには、フォームコントロールの「初期化」ボタン
 を配置し、下記のModule1に記述しているコードを「マクロの登録」しています。
 それぞれ、「Sub 作成()」「Sub 印刷シートを初期化()」のマクロを登録。

 ------------------------------------------
 'Module1に記述しているコード
 Option Explicit

 Sub 作成()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim sh3 As Worksheet, sh4 As Worksheet
    Set sh1 = ThisWorkbook.Sheets("リスト")
    Set sh2 = ThisWorkbook.Sheets("名札")
    Set sh3 = ThisWorkbook.Sheets("入力")
    Set sh4 = ThisWorkbook.Sheets("印刷")
   '------- 入力シート(sh3)にて、B1とB2の値を読み込む --------------
    Dim fr2 As Integer
    fr2 = sh1.Cells(Rows.Count, "A").End(xlUp).Row 'リストシート最終行(A列)
    Dim sr As Integer, fr As Integer, n As Integer
    sr = sh3.Range("B1")
    fr = sh3.Range("B2")
    n = fr - sr + 1
   '------- 印刷シート(sh4)にて、初期化と印刷範囲指定 --------------
    Call 印刷シートを初期化
    Dim fc As Integer
    fc = n * 4
    sh4.PageSetup.PrintArea = "$A$1:$A$" & fc '印刷範囲指定
   '------- 印刷シート(sh4)にて、列幅と行高の設定 ------------------
    Dim myRng As Range
    Dim i As Integer
    Set myRng = sh2.Range("A1:A4") '名札シートの「A1:A4」
    sh4.Range("A1").ColumnWidth = myRng.ColumnWidth
    For i = 1 To n * 4 Step 4
        sh4.Range("A" & i).RowHeight = myRng.Rows(1).RowHeight
        sh4.Range("A" & i + 1).RowHeight = myRng.Rows(2).RowHeight
        sh4.Range("A" & i + 2).RowHeight = myRng.Rows(3).RowHeight
        sh4.Range("A" & i + 3).RowHeight = myRng.Rows(4).RowHeight
       '改ページを追加(水平方向)
        sh4.HPageBreaks.Add Before:=sh4.Range("A" & i + 4)
    Next
   '------- 名札シート(sh2)の「A1:A4」の書式のみをコピー ---------
    myRng.Copy
    sh4.Range("A1").PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
   '------- 印刷シート(sh4)にて、(n*4)行目までフィルコピー -------
    sh4.Activate
    If fc > 4 Then
       sh4.Range("A1:A4").AutoFill Destination:=Range("A1:A" & fc)
    End If
    ActiveWindow.Zoom = 10 'ズーム10%
   'A1セル位置にスクロール
    Application.Goto Reference:=sh4.Range("A1"), Scroll:=True
   '------- 印刷シート(sh4)に記述するデータ ------------------------
    Dim k As Integer, j As Integer
    ReDim Data(1 To 4 * n, 1 To 1) As String
    Dim n1 As String, n3 As String
    n1 = sh2.Range("A1").Value
    n3 = sh2.Range("A3").Value
    i = sr
    For j = 1 To n * 4 Step 4
        Data(j, 1) = n1
        Data(j + 1, 1) = sh1.Range("C" & i)
        Data(j + 2, 1) = n3
        Data(j + 3, 1) = sh1.Range("B" & i)
        i = i + 1
        'If i > fr Then Exit For
    Next j
    Set myRng = sh4.Range(sh4.Cells(1, "A"), sh4.Cells(n * 4, "A"))
    myRng = Data '印刷シートにデータを記述
    sh4.PrintPreview
   '------- 後処理 --------------------------------------------------
    Set sh1 = Nothing
    Set sh2 = Nothing
    Set sh3 = Nothing
    Set sh4 = Nothing
    Set myRng = Nothing
 End Sub
 Sub 印刷シートを初期化()
    Dim sh4 As Worksheet
    Set sh4 = ThisWorkbook.Sheets("印刷")
    sh4.PageSetup.PrintArea = "" '印刷範囲を初期化
    sh4.ResetAllPageBreaks 'すべての改ページを解除
    sh4.Cells.RowHeight = 45
    sh4.Cells.ColumnWidth = 6.88
    sh4.Cells.Clear
    Set sh4 = Nothing
 End Sub
 ------------------------------------------
 Sub 作成()のコードを実行すると、「印刷」シートは、こうなります。
 4行ごとに、改ページが設定されています。
 書式は、「名札」シートの「A1:A4」を使用しています。
 データは、「リスト」から持ってきています。
 持ってくる範囲(行)は、「入力」シートのB1,B2セルより。

     |[A]     
 [1] |くみ    
 [2] |つき    
 [3] |なまえ  
 [4] |いちろう
 [5] |くみ    
 [6] |ほし    
 [7] |なまえ  
 [8] |じろう  
 [9] |くみ    
 [10]|ゆき    
 [11]|なまえ  
 [12]|さぶろう
 [13]|くみ    
 [14]|もも    
 [15]|なまえ  
 [16]|しろう  

(マリオ) 2017/02/10(金) 23:15


 >yasさん
 a4.xlsmでは、次のコードを使用しています。
 a3.xlsmを修正しました。修正箇所だけを下記に記述します。
 ************************************************************
   '------- 印刷シート(sh4)にて、列幅と行高の設定 ------------------
    Dim myRng As Range
    Dim i As Integer
    Set myRng = sh2.Range("A1:A4") '名札シートの「A1:A4」
    sh4.Range("A1").ColumnWidth = myRng.ColumnWidth '列幅を設定

    Dim Rng1 As Range, Rng2 As Range, Rng3 As Range, Rng4 As Range
    For i = 1 To n * 4 Step 4
        If Rng1 Is Nothing Then
           Set Rng1 = sh4.Range("A" & i) '印刷シートで行高を設定するセル(1)
        Else
           Set Rng1 = Union(Rng1, sh4.Range("A" & i)) '印刷シートで行高を設定するセル(1)
        End If
        If Rng2 Is Nothing Then
           Set Rng2 = sh4.Range("A" & i + 1) '印刷シートで行高を設定するセル(2)
        Else
           Set Rng2 = Union(Rng2, sh4.Range("A" & i + 1)) '印刷シートで行高を設定するセル(2)
        End If
        If Rng3 Is Nothing Then
           Set Rng3 = sh4.Range("A" & i + 2) '印刷シートで行高を設定するセル(3)
        Else
           Set Rng3 = Union(Rng3, sh4.Range("A" & i + 2)) '印刷シートで行高を設定するセル(3)
        End If
        If Rng4 Is Nothing Then
           Set Rng4 = sh4.Range("A" & i + 3) '印刷シートで行高を設定するセル(4)
        Else
           Set Rng4 = Union(Rng4, sh4.Range("A" & i + 3)) '印刷シートで行高を設定するセル(4)
        End If
        sh4.HPageBreaks.Add Before:=sh4.Range("A" & i + 4) '改ページを追加(水平方向)
    Next

    Rng1.RowHeight = myRng.Rows(1).RowHeight '行高を設定(1)
    Rng2.RowHeight = myRng.Rows(2).RowHeight '行高を設定(2)
    Rng3.RowHeight = myRng.Rows(3).RowHeight '行高を設定(3)
    Rng4.RowHeight = myRng.Rows(4).RowHeight '行高を設定(4)
   '------- 名札シート(sh2)の「A1:A4」の書式のみをコピー ---------
   ★以下省略

(マリオ) 2017/02/11(土) 12:06


 >マリオさん

たくさんの知識をありがとうございます!
教えていただいた諸々を、所定のフォームに当てはめる試行錯誤をやってみます。

結果は後日お知らせいたします。
(その前に、質問が発生しそうな予感もしますが)

希望人員分の印刷ができるようになっており、大変助かります。
(yas) 2017/02/13(月) 15:13


 >マリオさん

だいぶ日にちが経ってしまいましたが、試行錯誤しておりました。
改めて、教えてください。

開始行から終了行までの枚数分の印刷が、1枚ずつされたいです。

=例=
ファイル名・・出席簿
シート1名称・・出席簿
シート2名称・・名簿  以上の2シートで構成されている。

[出席簿]シートの概要【このページが印刷される、決まった様式】
印刷範囲・・B5:AI64
E2・・[名簿]シートのE6:E△△△からの入力規則によるプルダウン
B8・・「所属」=LOOKUP(E2,名簿!E6:E△△△,名簿!D6:D△△△)
F8・・「氏名」=LOOKUP(E2,名簿!E6:E△△△,名簿!C6:C△△△)
↓マリオさんからのアドバイスを受け(たつもり)
L2・・「開始行」入力規則のユーザー定義で=AND($L$2=INT($L$2),$L$2>=2)
L3・・「終了行」入力規則のユーザー定義で=AND($L$3=INT($L$3),$L$3>=$L$2,$L$3<=$M$2)
M2・・=LOOKUP(1,0/(名簿!B:B<>""),ROW(名簿!B:B))

[名簿]シートの概要
B列6行以降・・001〜の番号 例)B6=001
C列6行以降・・氏名      例)C6=いちろう
D列6行以降・・所属      例)D6=つき
E列6行以降・・=IF(C6="","",TEXT(B6,"000")&"_"&C6) 例)001_いちろう

Module5(になってしまいました)に、マリオさんからいただいたコードの必要そうな部分をどうにかこうにか引っ張ったつもりで、以下を記述して、ボタンに登録しました。

コードの半分以降に出てくる「i = sr」の「i =」で、「コンパイル エラー:変数が定義されていません」と表示されます。

**

Option Explicit

Sub まとめて印刷()

 Dim sh1 As Worksheet, sh2 As Worksheet
 Set sh1 = ThisWorkbook.Sheets("出席簿")
 Set sh2 = ThisWorkbook.Sheets("名簿")

 '「ここから」「ここまで」の数値を読み込む
 Dim fr2 As Integer
 fr2 = sh1.Cells(Rows.Count, "C").End(xlUp).Row '名簿の最終行(C列)
 Dim sr As Integer, fr As Integer, n As Integer
 sr = sh1.Range("L2")
 fr = sh1.Range("L3")
 n = fr - sr + 1

 '印刷範囲指定
 Dim fc As Integer
 fc = n * 4
 sh1.PageSetup.PrintArea = "$B$5:$AI$64"  '印刷範囲指定

 '印刷指示を出す?
 Dim K As Integer, j As Integer
 ReDim Data(1 To 4 * n, 1 To 1) As String
 Dim n1 As String, n3 As String
 n1 = sh1.Range("B8").Value
 n3 = sh1.Range("F8").Value

 i = sr
 For j = 1 To n * 4 Step 4
   Data(j, 1) = n1
   Data(j + 1, 1) = sh2.Range("D" & i)
   Data(j + 2, 1) = n3
   Data(j + 3, 1) = sh2.Range("C" & i)
   i = i + 1
   'if i > fr Then Exit For
 sh1.PrintPreview

 '後処理
 Set sh1 = Nothing
 Set sh2 = Nothing

End Sub

**

まったくとんちんかんなことをしているのでしょうか。
せっかく、時間を掛けてマリオさんに教えていただいたので、当てはめるべく頑張ってみたのですが。。。
(yas) 2017/02/23(木) 11:40


横入り失礼します。

>VLOOKUPで入力されたものを、一つ一つ印刷しているのですが、
これを生かして、
値だけ次々入力しなおしたらよくないですか?

Function 番号を配列に(s As String) As Variant

    Dim vv As Variant
    Dim vv2 As Variant
    Dim v As Variant
    Dim v2 As Variant
    Dim i As Long, j As Long
    Dim n(4999) As Long

    vv = Split(s, ",")
    For Each v In vv
        vv2 = Split(v, "-")
        For i = vv2(LBound(vv2)) To vv2(UBound(vv2))
            n(j) = i
            j = j + 1
        Next
    Next
    ReDim Preserve n(j)
    番号を配列に = n
End Function

Sub 一括印刷()

    Dim s As String
    Dim vv As Variant

    s = InputBox("連続する場合:1-5,飛び飛びの場合:1,3,6")
    vv = 番号を配列に(s)

    With Sheets("印刷")
        For Each v In vv
            .Range("E2").Value = Sheets("名簿").Cells(v + 1, 4).Value
            .PrintOut
        Next
    End With
End Sub

※入力ミスとキャンセルしたときとは考慮してません。
よさげなら、これを叩き台に作るのもありかなと。。。

(まっつわん) 2017/02/23(木) 13:22


 >まっつわんさん

ありがとうございます。
こちらのほうでもチャレンジしてみます!

早速の質問ですが、

Function 番号を配列に・・・


End Sub

をModuleに書き込みボタン登録。
ボタンを押すと"連続する場合:1-5,飛び飛びの場合:1,3,6"の窓が現れました。

そこに、例えば「3-5」で「OK」をすると

コンパイルエラー:配列は既に宣言されています。
のメッセージボックスが出現し、
ReDim Preserve n(j) のnまでがハイライトされます。
(End Functionの2行上)

解読しようにも、コードを読み解けずにおります。

あと少し!な気がしていますが、方法が違いますか?

(yas) 2017/02/23(木) 14:23


 >yas さん
 just a moment 

(マリオ) 2017/02/23(木) 19:59


あ?

>をModuleに書き込みボタン登録。
登録するなら、
「一括印刷」の方を。。。。

というか

一括印刷のほうのプロシージャ内にカーソルがある状態で、
F5キー押下かツールバーの再生ボタンクリックで起動できます。。。

(まっつわん) 2017/02/23(木) 20:07


 >yas さん

 (マリオ) 2017/02/10(金) 23:15 に書き込みましたが、再度、
 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
http://d.kuku.lu/cd9977d4fd
 添付ファイル(a4.xlsm)←これを試してみてください(最終版です)。
  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  上記のエクセルファイルを試されましたでしょうか?

(マリオ) 2017/02/24(金) 03:25


 >yas さん

 よろしかったら、サンプルデータ(エクセルファイル)を
 アップロードしてもらえませんか?

http://up3.karinto.in/uploader2/

 このサイトに、【ダウンロードパスワード】と【削除用キー】
 の2つを設定して、アップロード

 あとで削除できるように【削除用キー】を設定する!

 ********************************************************
 エクセルのファイルをアップロードするまえに、
 ファイルを右クリックして、
 [プロパティ]→[詳細]→[プロパティや個人情報を削除]を左クリック
 →このファイルから次のプロパティを削除のラジオボタンを選択
 →[すべて選択]→[OK]ボタンで、個人情報を削除
 ********************************************************

(マリオ) 2017/02/24(金) 03:38


 >まっつわんさん

一括印刷のほうのプロシージャ内にカーソルがある状態で、
F5を押してみた&再生ボタンでも、実行してみました。

どちらを実行しても、やはり
「コンパイルエラー:配列は既に宣言されています」の窓が出て
「ReDim Preserve n」がハイライトされてしまい、
印刷まで進むことができませんでした。

また、登録したボタンも一括印刷のみを登録しましたが、
同様の結果となりました。

(yas) 2017/02/24(金) 11:23


 >マリオさん

a4ファイルを試しました!
できました!!(感動です)

いただいたa4ファイルはできたのですが、現物のファイルでは
印刷シートを改めて作り、同じデータをいくつも繰り返し表示させるには
そもそもの範囲(B5:AI64)が広すぎると思い、
印刷シートを作成せず、出席簿シートそのままで、
うらっかわの指示として印刷できないものか、
と素人なのに試行錯誤をしてみました。
(上記のコード)

サンプルファイル、これから加工してみます!
ありがとうございます。
(yas) 2017/02/24(金) 11:52


 >yas さん

 a4.xlsmファイルでは、名札シートの「A1:A4セルの範囲」をフォーマットエリアとして使用しています。

 yasさんは、「出席簿」シートの★「B5:AI64セルの範囲」をフォーマットエリアとして使用しているのですよね?
 フォーマットエリアが違うので、
 a4.xlsmを編集(加工)するのは、困難だと思いますよ。

 そこで、サンプルマクロを作成してみました。
 フォーマットエリアが変更されても、対応できるように。
 確認してみてください。
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 (サンプルのマクロ)
 【行高と列幅_改ページ_印刷範囲.xlsm】
http://d.kuku.lu/4d5e8f3a48

 4つのマクロの概要
 ・「出席簿」シートにフォーマットを作成
 ・「出席簿」シートを初期化
 ・「印刷」  シートを作成   ←   ★フォーマットを5回繰り返す
 ・「印刷」  シートを初期化
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

■使用方法

 Sub 出席簿シート_フォーマット作成()を実行後に、
 Sub 作成()を実行してください!

 _
 _
 ************************************************
 (本件が、無事終了した後にコードを掲載します)
 「名簿」シートには、何も記述していません。 

 フォーマットエリアの変更は、コードで次のところを変更するだけ

 Const col_1 As String = "B"
 Const col_2 As String = "AI"
 Const r1 As Long = 5
 Const r2 As Long = 64

(マリオ) 2017/02/24(金) 14:43


 >yas さん

 「出席簿」シートの
 フォーマットエリア「B5:AI64セルの範囲」の範囲内で、
 ★「結合されているセル」があれば、
 教えてください。

 また、文字列を入れたいのは、
 「B5:AI64」の範囲だけで考えると、どのセルでしょうか?

 例えば、「B5:K20」が結合されていて、
 B5に、マクロで名前を入力したい!などのように、説明してもらえますか?

 サンプルファイルがあれば、イメージしやすいのですが…。
(マリオ) 2017/02/24(金) 14:44

>どちらを実行しても、やはり
あ、失礼しました、デバッグしたつもりが、
途中のやつだったみたいです。すみません。

Function 番号を配列に(s As String) As Variant

    Dim vv As Variant
    Dim vv2 As Variant
    Dim v As Variant
    Dim v2 As Variant
    Dim i As Long, j As Long
    Dim n() As Long
    ReDim n(4999)

    vv = Split(s, ",")
    For Each v In vv
        vv2 = Split(v, "-")
        For i = vv2(LBound(vv2)) To vv2(UBound(vv2))
            n(j) = i
            j = j + 1
        Next
    Next
    ReDim Preserve n(j - 1)
    番号を配列に = n
End Function

Sub 一括印刷()

    Dim s As String
    Dim vv As Variant
    s = InputBox("連続する場合:1-5,飛び飛びの場合:1,3,6")
    vv = 番号を配列に(s)
    With Sheets("印刷")
        For Each v In vv
            .Range("E2").Value = Sheets("名簿").Cells(v + 1, 4).Value
            .PrintPreview
        Next
    End With
End Sub
(まっつわん) 2017/02/24(金) 16:09

 >マリオさん

アップロードしました。 
http://up3.karinto.in/uploader2/download/1487923074.xlsm

確認できますでしょうか。

なぜか、サンプル用にリストの部分を加工したら、
[出席簿]シートのE2でプルダウンをしても
[出席簿]シートのC8が0で反応しなくなり、
改めて手入力でLOOKUP関数を入れてみたら
数式が表示されるようになってしまいました。

時間の許す限り、改善を試みたのですが、まったく改善されませんでした。
(しかも、飛び飛びで存在するデータを消すと、
反応すらされなくなるという怪奇現象も起こります)

[出席簿]シートのE2をプルダウンすると、自動的に
[出席簿]シートのC8には[名簿]シートのD列が
[出席簿]シートのF8には[名簿]シートのC列が入力されるのです。

[出席簿]シートのE2のデータの元は、[名簿]シートのE列によります。

したいのは、例えば011番〜014番と選べば、「出席簿」を1枚ずつ印刷する。です。
(まっつわんさんのおっしゃるような)

壊れたファイルがサンプルとなりましたが(とても不本意です)
大丈夫なものでしょうか。

(yas) 2017/02/24(金) 17:13


 >まっつわんさん

ありがとうございます!
今度は印刷プレビューまで行きました。

が、印刷プレビューになると
B8もF8も「#N/A」になってしまい、
印刷プレビューから普通の画面に戻ると、
プルダウンのE2セルが空白になります。

再び、また私も研究してみます。
(yas) 2017/02/24(金) 17:19


 >yas さん
 ダウンロードパスワードが、わかりません。教えてください。

(マリオ) 2017/02/24(金) 20:01


 >マリオさま

大変失礼しました。
「3535」です。

なくてもダウンロードができるのかと勘違いしていました。
マリオさんは、パスワードの設定をしないでアップしてくれていたのですね!
(yas) 2017/02/27(月) 09:44


プルダウンのE2セルが空白になります。

ということは、
Sheets("名簿").Cells(v + 1, 4).Value
↑ここでちゃんとした値が入ったセルを指定できてないという事だと思います。

 >【「リスト」シート】 
 >    |[A] |[B]     |[C] |[D]                   
 > [1]|番号|名前    |組  |                      
 > [2]| 001|いちろう|つき|001_いちろう          
 > [3]| 002|じろう  |ほし|002_じろう            
 > [4]| 003|さぶろう|ゆき|003_さぶろう          
 > [5]| 004|しろう  |もも|004_しろう            
 > [6]| 005|ごろう  |うめ|=TEXT(A6,"000")&"_"&B6

ならば、
Workbooks("名簿.xlsx").Sheets("リスト").Cells(v + 1, 4).Value
とかですかねぇ。。。

なんにしても、
「003」番の人を印刷したいと思ったなら、
(3+1)行目の4列目の値を、
印刷シートのE2セルに転記したら、いいんですよね?
なら、そう書けばいい話です。
コードをよく見比べてみて確認ください。

うっ、シート名が微妙に色々なのかな?
まぁ、あとはそちらでデバッグしていただくしか。。。。

***********************************

ちょっと話変わりますけど、、、

ファイルのやり取りをすれば確実だけど、、、、
ウィルスチェックとか誰がしてくれるの?
見ず知らずの人と安易にファイルのやり取りしない方がいいかも。。。
(悪意があろうとなかろうと)

あと、他に見てる人に話が通じなくなるので、
当人同士では便利で確実だけど、
後から見て参考にしたい人のために、
見て、試行錯誤の結果や解決方法が解るようにログ残しておくのも、
大切なことだと思いますよ^^

(まっつわん) 2017/02/27(月) 14:06


あ、

vには

「1,3-5」 とインプットボックスに入れた場合は、

1
3
4
5
と順番に入ってくるつもりで書いてます。

ステップ実行をしながら、
変数の中身を確認しながら、
意図したセルが指定出来てるか確認してください。

(まっつわん) 2017/02/27(月) 14:09


 >まっつわんさん

プルダウンが空白になる件が解決しました。

Sheets("名簿").Cells(v + 1, 4).Value
の解説をいただいたことで、判明しました。
実物は
Cells(v + 5, 5).Value
でした。

印刷することができた!のですが、例えば、
2-5の印刷指示を出しても、2,4,6と指示を出しても、
2番の人しか印刷されません。

となると、同じように
Function 番号を配列に・・・の方のなにかしらが、
いただいたコードと違っていたりするのでしょうか。
(j+1/j-1の1を変えてみましたが、全然関係のない部分でした)

実物は以下のようになっていました。
  |[B]|[C]   |[D] |[E]
[6]|001|いちろう|つき|001_いちろう
(〜[B]については250([255]行)までマスだけ作ってある)

ファイルの件、確かにそうですね。
私はど素人ですしなおさらです。
そのほかに、他の人の参考として、ということも。
教えていただいて良かったです。
ありがとうございます。

2-5と指示して、2が印刷できたことに感動しています。
(-5ができていないのは置いておいて)

(yas) 2017/02/27(月) 16:32


ぬぬぬ。。
>2-5の印刷指示を出しても、2,4,6と指示を出しても、
>2番の人しか印刷されません。
じゃ、

Sub 一括印刷()

    Dim s As String
    Dim vv As Variant
    s = InputBox("連続する場合:1-5,飛び飛びの場合:1,3,6")
    vv = 番号を配列に(s)
    Stop                '←追加(一時停止の命令。再開はF5キー押下)
    With Sheets("印刷")
        For Each v In vv
            .Range("E2").Value = Sheets("名簿").Cells(v + 1, 4).Value
            .PrintPreview
        Next
    End With
End Sub

Stopを入れて、プログラムを一旦止めて、
ローカルウィンドウで、
vvの左の「+」をクリックして中身がどうなっているか教えてください。

(まっつわん) 2017/02/27(月) 17:16


 >まっつわんさん

2-5の指示、Stop
vv(0) 2 Long
vv(1) 3 Long
vv(2) 4 Long
vv(3) 5 Long

です。
(yas) 2017/02/27(月) 17:58


 >まっつわんさま

どこか変更できるところはありますでしょうか。

更新時間と、最後の書き込み時間が違うのが気になりました。
もしかして、ご回答いただいていたものが消えてしまったのでしょうか。
(一覧では更新時間が2/27(月) 19:58でした)

もう一息のところ、よろしくお願いします。
(yas) 2017/02/28(火) 17:03


 >yas さん
 ファイルのやりとりをしなくても、掲示板だけの書き込みで分かるならいいのですが…。
 (yas) 2017/02/24(金) 17:13 のファイルは削除したんですね?
 すっかり内容も忘れてしまいましたが、何をしたいのでしょうか?
 もう一度、書いてもらえませんか?
(または、この掲示板のどこを見ればよいか、教えてください。)
(マリオ) 2017/02/28(火) 17:09

 >マリオさま

削除!!してませんよ!?
方法もわかりませんし!
更新時間と、最終の書き込みの時間が違ってたし、
なにかが起こっているのでしょうか。。。

しかも、実は2/27(月)の17:58以降に
マリオさん宛に「素人の私には難しいのですが、
今後も活用できるようになりたいし、もう少し時間をください」のようなことをコメントしたつもりなのですが残ってなくて、”つもり”だけど更新し損ねたのかと残念に思っていました。
(自分のうっかりだと思いますが)
(yas) 2017/02/28(火) 17:32


 >マリオさま

大変失礼しました。
コメントを消した、かと勘違いしました。

改めまして。

***

【印刷指示の開始番号から終了番号までの枚数分の印刷が、1枚ずつされたい】
=現状の例=
ファイル名・・出席簿
シート1名称・・出席簿
シート2名称・・名簿  以上の2シートで構成されている。 ←できれば変えたくない

[出席簿]シートの概要【このページが印刷される、決まった様式】 ←できれば変えたくない
印刷範囲・・B5:AI64
E2・・[名簿]シートのE6:E△△△からの入力規則によるプルダウン
B8・・「所属」=LOOKUP(E2,名簿!E6:E△△△,名簿!D6:D△△△)
F8・・「氏名」=LOOKUP(E2,名簿!E6:E△△△,名簿!C6:C△△△)

[名簿]シートの概要
B列6行以降・・001〜の番号 例)B6=001
C列6行以降・・氏名     例)C6=いちろう
D列6行以降・・所属     例)D6=つき
E列6行以降・・=IF(C6="","",TEXT(B6,"000")&"_"&C6) 例)001_いちろう
([B]列については250までマスだけ作ってある([6〜255]行))

***

です。

もし、開始番号と終了番号を入れるとすると、
[出席簿]シートのL2とL3です。

情報はこちらで足りますか?

(yas) 2017/02/28(火) 17:44


 yas さん
 >情報はこちらで足りますか?
 足りてないので、イメージできません。

 a4ファイルでは、フォーマットとするシートのセル範囲が、「A1:A4」でしたが、
 実際にフォーマットとしたいシート【[出席簿]シート】は、セル範囲が、
「B5:AI64」なのですよね?

 (yas) 2017/02/28(火) 17:44の書き込みだけを見ています。
  *****************************************************
 [出席簿]シートの「B5:AI64」セル の範囲において、
 下記の(1)〜(3)は、どうなっているかを教えてください。

 (1)結合しているセルはあるのか?あれば、そのセル範囲。
    B8とF8は、結合されているのでは、ないですか?

 (2)文字列を入れる予定のセルはどこか?
 「そのセル範囲」と「その文字列」
 B8とF8以外にも、文字列があるのではないですか?
 「くみ」「なまえ」を入れるセルがあるんじゃないですか?

 (3)念のため、セル幅(ピクセル値で!)、行高(ピクセル値で!)

  その他の書式(フォント名とか、セルの塗りつぶし色とか)の説明は
  不要ですが、していただけるとイメージが湧きます

 **************************************************
 [名簿]シートについてですが、
 C6以降の名前で、空白はありますでしょうか?

 例えば、次のような場合(C6が名前の開始行、C8が名前の最終行)
 C7が空白になっていることは、ありますでしょうか?

 C6=いちろう
 C7=じろう
 C8=さぶろう
 **************************************************
 [出席簿]シートでは、
 印刷範囲・・B5:AI64 
 としたので
 「5〜64行でかつ、B列〜AI列」は使用したくありません。

 なので、
 >E2・・[名簿]シートのE6:E△△△からの入力規則によるプルダウン 
 で、E2を使用したいとされてますが、
 E2に変えて、例えば、AK2でもいいですか?

 同様に、
 >[出席簿]シートのL2とL3です。 
 で、L2,L3を使用したいとされてますが、
 L2に変えて、AM2
 L3に変えて、AM3でもいいですか?

  **************************************************
  それとも、ファイルをアップし直しますか?下記のサイトなら、
  ダウンロードする側は、パスワードを入力する必要はありません。
http://d.kuku.lu/

 なお、エクセルファイルをアップロードするなら、
 エクセルファイルを右クリックして、詳細tabの下の
 「プロパティや個人情報を削除」を左クリック
 →「このファイルから次のプロパティを削除」のラジオボタンを選択
 →「すべて選択」を左クリック→「OK」ボタンを左クリック
 して、個人情報を削除してからにしてください。

 なぜなら、作成者などの個人情報が残っている可能性があるため!

(マリオ) 2017/02/28(火) 19:08


 >まっつわんさん!

できました!!
改めてちゃんと見直してみたところ、
たぶん私のうっかりミスにより(セルの指定の違いなど)
きちんと稼動しなかっただけでした。
私のミスなのに、催促してすみませんでした。

プレビュー版と、すんなり印刷版
それぞれのボタンを作って完成品としました。

大変助かりました!
ありがとうございました。

(yas) 2017/03/01(水) 16:10


 >マリオさま

ずいぶんマリオさんのお時間をいただいてしまいました!

今回は、なるべく今存在するフォームに変更を加えることをしたくなかったため
まっつわんさんの方法を試してみました。

ですが、マリオさんに教えていただいたやり方も、
イチから作る場合にとても便利そうです。
また、印刷シートとして、現物を一度目にすることができるのも親切です。
サンプルのファイルもいただきましたし、
しっかり読み込んで勉強してみたいと思います。

マリオさんにおいては、中途半端になってしまう感じになってしまうかもしれませんが、
マリオさんの玄人具合と私の素人具合との差によるものと、ご容赦ください。

本当にありがとうございました。

(yas) 2017/03/01(水) 16:24


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.