Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12880 / 13646 ツリー ←次へ | 前へ→

【7920】複数のデーターを1つの表に カオル 03/9/23(火) 22:16 質問
【7932】Re:複数のデーターを1つの表に しのしの 03/9/24(水) 14:37 発言
【7948】Re:複数のデーターを1つの表に カオル 03/9/25(木) 0:50 発言
【8009】Re:複数のデーターを1つの表に しのしの 03/9/26(金) 14:01 発言
【8036】Re:複数のデーターを1つの表に カオル 03/9/27(土) 2:58 質問
【8038】Re:複数のデーターを1つの表に しのしの 03/9/27(土) 12:03 発言
【8051】Re:複数のデーターを1つの表に カオル 03/9/28(日) 13:40 質問
【8073】Re:複数のデーターを1つの表に しのしの 03/9/29(月) 13:47 回答
【8188】Re:複数のデーターを1つの表に カオル 03/10/3(金) 0:51 お礼

【7920】複数のデーターを1つの表に
質問  カオル  - 03/9/23(火) 22:16 -

引用なし
パスワード
   シート”品質管理表”のA−C、E−G、I−K、M−O、P−Rの各列に別シート”計算シート”から計算式が入ってるセルを”リンク貼り付け”でコピーしているのですが、各データ列を1つのデータ列にまとめたいのですが、方法が思いつかないので教えてください。各データ列は100行までリンクしてありその時々で10行で有ったり30行だったりします、T−V行にまずA−C列のデータを入れ、その下に空白行を入れずにE−G列のデータを入れ、P−R列まで繰り返していれたいのです。A・E・I・M・P列のデータには空白が出る事も有ります。

【7932】Re:複数のデーターを1つの表に
発言  しのしの  - 03/9/24(水) 14:37 -

引用なし
パスワード
   カオルさん、こんにちは。
まず、問題点を整理させてください。

>別シート”計算シート”から計算式が入ってるセルを
>”リンク貼り付け”でコピーしているのですが
"計算シート"から取得したいセルはすべて、計算式が格納されているということですか?

>E・I・M・P列のデータには空白が出る事も有ります。
この列のリンク元である"計算シート"のセルも計算式が格納されているのですか?
#ちなみに、リンク貼り付けされているのであれば、空白ではないです。
#オプションでゼロ値非表示を選択されているのだろうと思います。

私としては、リンク貼り付けをした同じシートのセルよりも、
"計算シート"自体から取得して、値を格納したほうが、数段処理をしやすいので、
"計算シート"の仕様を教えていただきたいのですが、そうするとややこしいですか?

【7948】Re:複数のデーターを1つの表に
発言  カオル  - 03/9/25(木) 0:50 -

引用なし
パスワード
   しのしの さん 今晩は
>>別シート”計算シート”から計算式が入ってるセルを
>>”リンク貼り付け”でコピーしているのですが
>"計算シート"から取得したいセルはすべて、計算式が格納されているということですか?
>>E・I・M・P列のデータには空白が出る事も有ります。
>この列のリンク元である"計算シート"のセルも計算式が格納されているのですか?
>>>そうですすべてに計算式が入ってます。IF関数を使用して空白を作ってます。

>#ちなみに、リンク貼り付けされているのであれば、空白ではないです。
>#オプションでゼロ値非表示を選択されているのだろうと思います。

>>>ゼロ値表示にしてもゼロは表示されません

>私としては、リンク貼り付けをした同じシートのセルよりも、
>"計算シート"自体から取得して、値を格納したほうが、数段処理をしやすいので、
>"計算シート"の仕様を教えていただきたいのですが、そうするとややこしいですか?
>>>いえもしその方が良ければ一向に構いません。”計算シート”ですが、最終的には、”送り出し表”に格納してプリントするのですが、まず製品は最大5種類
有ります、一般用・本社用内・納本用内・本社用外・納本用外です。
製品は仕事単位でいつもデータが変わります。
例えば一般用は500部x24本が10パレットだったり500部x64本が20パレットと500部X23本と300部x1本、というように半端の数字がでます、E・I・M・Pが空白になるのは上の例えで言うと、1〜20パレット目までは500部x64本、21パレット目は500部x24本と300部x1本が一緒に載るのですが、送り出し表に格納する時は21行目に”21””500””23”の数字を格納して22行目に”300””1”と格納したいので、22行目にパレット数はいらないという事です。
1つの仕事によって一般用だけだったり、一般用と本社内と納本外だけだったりします。
今の計算式だとY2〜AA2列に一般用分の計算式が入ってます、Y2列にはパレット数、Z列には部数、AA列には本数と言う様に
本社内はAG2〜AJ2、納本内はAO2〜AQ2、本社外はAW2からAY2、納本外はBE2〜BG2列に計算式が入っています。これを順次格納したいのです
今現在は送り出し表に一般用だけリンク貼り付けして使用してます。表が20行しかないので3枚まで使っています。

分かりましたでしょうか。しのしのさん、よろしくご指導ください。

【8009】Re:複数のデーターを1つの表に
発言  しのしの  - 03/9/26(金) 14:01 -

引用なし
パスワード
   しのしのです。

>>>>そうですすべてに計算式が入ってます。IF関数を使用して空白を作ってます。
>
>>#ちなみに、リンク貼り付けされているのであれば、空白ではないです。
>>#オプションでゼロ値非表示を選択されているのだろうと思います。
>
>>>>ゼロ値表示にしてもゼロは表示されません
確かにIF関数でブランクを入れているなら、
値がはいっているので、ゼロは表示されませんね。

>分かりましたでしょうか。しのしのさん、よろしくご指導ください。

申し訳ありませんが、全く理解できません。
私が知りたいのは、"仕事"の内容ではなく、"EXCELシートに格納されている値”です。
ですから、
>製品は仕事単位でいつもデータが変わります。
では、それが、excelのどこの部分を指すのか、全くわかりません。

とにかく、"計算式の格納したセル"というのは、
アプリケーション的には、"値のはいったセル"になりますので、
カオルさんご希望の"空白行をいれずに"という定義が何かによって、
処理がかなり変化します。
ですから、カオルさんの"シート上で"やりたいこと、を
明確にしていきたいと考えています。ご協力よろしくお願いします。

カオルさんの、記述から推定する仕様を次に記述しますので、確認してください。

確認1)1つの"製品"に対して、
"一般用・本社用内・納本用内・本社用外・納本用外"
という大項目があり、それぞれ小項目として
・パレット番号
・部数
・本数
存在する。これらが何らかの形で、1つのシートに格納されている。

確認2)まとめるデータ項目は次の3つ構成されている
・パレット番号(ただし、上の行と重複する場合は、空白とする)
・部数
・本数

確認3)まとめるデータは、
"一般用・本社用内・納本用内・本社用外・納本用外"というデータ
をそのまま取得する。ソートなどは行なわない。

次は不明点ですので、回答方よろしくお願いします。

Q1)
>1〜20パレット目までは500部x64本、21パレット目は500部x24本と300部x1本が一緒に載るのですが、
"一緒に載る"とはどういうことですか?"計算シート"でではどういう形で値が格納されているのですか?     
具体的に、
>Y2〜AA2列に一般用分の計算式
とは、どういう計算式なのか、ご提示ください。

Q2)
上記Q2とも関連しますが、"計算シート"の行は何を示していますか?
(例えは、行項目はパレット番号である。など)

【8036】Re:複数のデーターを1つの表に
質問  カオル  - 03/9/27(土) 2:58 -

引用なし
パスワード
   しのしのさん 今晩は

説明が的外れだったようで、すみません

>>製品は仕事単位でいつもデータが変わります。
>では、それが、excelのどこの部分を指すのか、全くわかりません。

>>>各データ列の行数が変わると言いたかったのです。

>ですから、カオルさんの"シート上で"やりたいこと、を
>明確にしていきたいと考えています。ご協力よろしくお願いします。

>>>ご迷惑を掛けると思いますがよろしくお願いします

>確認1)1つの"製品"に対して、
>"一般用・本社用内・納本用内・本社用外・納本用外"
>という大項目があり、それぞれ小項目として
>・パレット番号
>・部数
>・本数
>存在する。これらが何らかの形で、1つのシートに格納されている。

>>>この場合、1つの仕事の製品の総部数が有り"一般用・本社用内・納本用内・本社用外・納本用外"に分かれていると言うのが正しいです。後は合ってます

>確認2)まとめるデータ項目は次の3つ構成されている
>・パレット番号(ただし、上の行と重複する場合は、空白とする)
>・部数
>・本数

>>>合ってます。

>確認3)まとめるデータは、
>"一般用・本社用内・納本用内・本社用外・納本用外"というデータ
>をそのまま取得する。ソートなどは行なわない。

>>>合ってます。

>次は不明点ですので、回答方よろしくお願いします。
>
>Q1)
>>1〜20パレット目までは500部x64本、21パレット目は500部x24本と300部x1本が一緒に載るのですが、
>"一緒に載る"とはどういうことですか?"計算シート"でではどういう形で値が格納されているのですか?     
>>>上記の例えで言うと最終パレット(21パレット目)が64本に満たない場合は部数が変わっても21パレットにします。

     Y  Z  AA

    18 500 64
    19 500 64
    20 500 64
    21 500 24
       300  1

>>Y2〜AA2列に一般用分の計算式
>とは、どういう計算式なのか、ご提示ください。
>>>Y2〜AA2からY61〜AA2までの間違いでした。

>>>
>Q3)
>上記Q2とも関連しますが、"計算シート"の行は何を示していますか?
>(例えは、行項目はパレット番号である。など)
>>>パレット番号です

言葉だけだと分かりにくいと思いますので

 1 500 64 本社内1 500 64 納本内1 500 64 本社外1 500 11 納本外1 300 1
 2 500 64 本社内2 500 30 納本内2 500 10     300 1 
 3 500 64     400 1 
 4 500 64  
 5 500 25
  250 1

上のデータを
   1 500 64 
   2 500 64 
   3 500 64      
   4 500 64  
   5 500 25
    250 1
本社内1 500 64 
本社内2 500 30 
    400 1
納本内1 500 64 
    500 10 
本社外1 500 11 
    300 1
納本外1 300 1   

という様にしたいのですが、"一般用・本社用内・納本用内・本社用外・納本用外"の計算式が各60行あるので、計算式でブランクになった行を詰めて表記したいのです。

【8038】Re:複数のデーターを1つの表に
発言  しのしの  - 03/9/27(土) 12:03 -

引用なし
パスワード
   どうも、自分の日本語能力に限界を感じるこの頃です。


>>Q1)
>>>1〜20パレット目までは500部x64本、21パレット目は500部x24本と300部x1本が一緒に載るのですが、
>>"一緒に載る"とはどういうことですか?"計算シート"でではどういう形で値が格納されているのですか?     
>>>>上記の例えで言うと最終パレット(21パレット目)が64本に満たない場合は部数が変わっても21パレットにします。
>
>     Y  Z  AA
>
>    18 500 64
>    19 500 64
>    20 500 64
>    21 500 24
>       300  1
>
>>>Y2〜AA2列に一般用分の計算式
>>とは、どういう計算式なのか、ご提示ください。
>>>>Y2〜AA2からY61〜AA2までの間違いでした。

「計算式」って、「エクセル関数」っていう意味じゃないんですか?
(例えば、=SUM(AA2:AY2)のような)
カオルさんのいう「計算式」の定義をお教え下さい。
「Y2〜AA2からY61〜AA2までの間違いでした。」って?

>>>>
>>Q3)
>>上記Q2とも関連しますが、"計算シート"の行は何を示していますか?
>>(例えは、行項目はパレット番号である。など)
>>>>パレット番号です
>
>言葉だけだと分かりにくいと思いますので
>
> 1 500 64 本社内1 500 64 納本内1 500 64 本社外1 500 11 納本外1 300 1
> 2 500 64 本社内2 500 30 納本内2 500 10     300 1 
> 3 500 64     400 1 
> 4 500 64  
> 5 500 25
>  250 1
>
>上のデータを
>   1 500 64 
>   2 500 64 
>   3 500 64      
>   4 500 64  
>   5 500 25
>    250 1
>本社内1 500 64 
>本社内2 500 30 
>    400 1
>納本内1 500 64 
>    500 10 
>本社外1 500 11 
>    300 1
>納本外1 300 1   
>
>という様にしたいのですが、"一般用・本社用内・納本用内・本社用外・納本用外"の計算式が各60行あるので、計算式でブランクになった行を詰めて表記したいのです。

カオルさんご提示の例は、その”計算シート”のA列からR列に含まれている
データを指すのではないですか?


仕様を理解出来ないので、
(私に説明しているのも、無駄でしょうから)
解決策をさがしていきましょう。
その小項目のうち、パレット数は空白になることがあっても、
その他の2つには必ず、値がはいる。すなわち、部数、本数が空白のときは、
データが最後まで来た、と判断して構わないのでしょうか?

【8051】Re:複数のデーターを1つの表に
質問  カオル  - 03/9/28(日) 13:40 -

引用なし
パスワード
   しのしのさん
説明不足ですいません

>「計算式」って、「エクセル関数」っていう意味じゃないんですか?
>(例えば、=SUM(AA2:AY2)のような)
>カオルさんのいう「計算式」の定義をお教え下さい。

>>エクセル関数です。ですが、計算式を見てもわかりずらいんじゃないかと思いまして表記しませんでした。すいません

>「Y2〜AA2からY61〜AA2までの間違いでした。」って?
>>計算式が入ったセルが60行あるといいたかったのです
>>>下がY2〜AA2に入ってる計算式です
Y2
=IF(X2="","",IF(AND(X2=(-1),Z2=""),"",$U$1-X2))

Z2
=IF(W2>=$U$25,"",IF(AND($U$1=0,$U$2=0,$U$3=0),"",IF(W2<$U$23,$C$8,
IF(AND(W2=$U$23,$U$2>0),$C$8,IF(AND(W2=$U$23,$U$2=0,$U$3>0),$U$3,
IF(AND(W2=$U$24,$U$2>0,$U$3=0),"",IF(AND(W2=$U$24,$U$2>0),$U$3,
"")))))))

AA2
=IF(W2>=$U$25,"",IF(AND($U$1=0,$U$2=0,$U$3=0),"",IF(W2<$U$23,$C$9,
IF(AND(W2=$U$23,$U$2>0),$U$2,IF(AND(W2=$U$23,$U$2=0,$U$3>0),1,IF(AND(W2=$U$24,$U$2>0,$U$3=0),"",IF(AND(W2=$U$24,$U$2>0),1,"")))))))
 
>カオルさんご提示の例は、その”計算シート”のA列からR列に含まれている
>データを指すのではないですか?

>>違います。Y2〜AA2、AG2〜AI2、AO2〜AQ2、AW2〜AY2、BE2〜BG2に入ってる値を並べたものです。

>解決策をさがしていきましょう。
>その小項目のうち、パレット数は空白になることがあっても、
>その他の2つには必ず、値がはいる。すなわち、部数、本数が空白のときは、
>データが最後まで来た、と判断して構わないのでしょうか?
>>>そのとうりです。

【8073】Re:複数のデーターを1つの表に
回答  しのしの  - 03/9/29(月) 13:47 -

引用なし
パスワード
    >>カオルさんご提示の例は、その”計算シート”のA列からR列に含まれている
>>データを指すのではないですか?
>
>>>違います。Y2〜AA2、AG2〜AI2、AO2〜AQ2、AW2〜AY2、BE2〜BG2に入ってる値を並べたものです。
>
>>解決策をさがしていきましょう。
>>その小項目のうち、パレット数は空白になることがあっても、
>>その他の2つには必ず、値がはいる。すなわち、部数、本数が空白のときは、
>>データが最後まで来た、と判断して構わないのでしょうか?
>>>>そのとうりです。

上記を自分なりに解釈してコードにしてみました。

この計算シートを保存しているブックに
標準モジュールシートとクラスモジュールを1つずつ用意してください。
#計算式からみて、ブックの容量もかなり大きそうなので、
#別ブックにコードを保存したほうがいいかもしれません。
#でもとりあえず、確認はこのままで。

シートの内容を書き換えるので、バックアップは撮って置いてくださいね。

【標準モジュールのコード】
Option Explicit
Sub TEST()
  Dim rngDest       As Excel.Range
  Dim wshSource      As Excel.Worksheet
  Dim lngCount         As Long
  Dim cls1        As Class1
  Dim lngWize       As Long
  Dim iCellAdd      As Variant
  Dim varSourceCellAdd  As Variant
  
  'もとデータとなるシートを設定してください。
  '今は計算シートを設定しています
  Set wshSource = ThisWorkbook.Worksheets("計算シート")
  wshSource.Calculate
  
  '大項目の先頭セルアドレスを指定してください。
  '今は前の箱にあった値を設定しています。
  varSourceCellAdd = Array("Y2", "AG2", "AO2", "AW2", "BE2")
  
  'もとデータの行数をセットしてください。前の回答で60とあったので、
  '60にしています
  lngCount = 60
  
  'もとデータは3列とします。
  lngWize = 3
  

  '1つの表にしたい左上先頭セルを指定してください。
  '今は、仮に"品質管理表シート"の「T1」セルとしておきます。
  Set rngDest = ThisWorkbook.Worksheets("品質管理表シート").Range("T1")
  
  
  '必要なら、書き込む表のクリアをしてください。
  'ここは仕様になかったので、単に列をクリアします。
  '必要に応じて、書き直してください。
  rngDest.Resize(, lngWize).EntireColumn.Clear
  
  'フィルタークラスを生成します。
  Set cls1 = New Class1
  For Each iCellAdd In varSourceCellAdd
    Call cls1.setValues( _
      wshSource.Range(CStr(iCellAdd)).Resize(lngCount, lngWize))
    If cls1.SpecalFilter = True Then
      Call cls1.Up(rngDest)
      Set rngDest = rngDest.Offset(cls1.RowsCount)
    End If
  Next iCellAdd

  Set cls1 = Nothing
  Set rngDest = Nothing
  Exit Sub
End Sub


【クラスのコード】クラス名はCLASS1のままにしてあります。

' Excel Cell範囲Value(二次元配列)を取り扱うクラス
'結合セルには考慮しない
'二次元配列はセルから取得するので、配列添字開始は1として取り扱っている
Option Explicit
Option Base 0
Option Compare Binary

Private mArray As Variant

Private Sub Class_Terminate()
On Error Resume Next
  Erase mArray
End Sub

Public Property Get RowsCount() As Long
  If IsArray(mArray) = False Then
    RowsCount = 0
    Exit Property
  Else
    RowsCount = UBound(mArray, 1)
  End If
End Property

'取り扱うセルの値を取得する
Public Sub setValues(ByRef rRng As Excel.Range)
  If (rRng Is Nothing) = True Then
    mArray = Empty
  Else
    mArray = rRng.value
  End If
End Sub


Public Function SpecalFilter() As Boolean
On Error GoTo HandleErr
  Dim irow      As Long
  Dim icol      As Long
  Dim lngNewElem   As Long
  Dim TmpArray()   As Variant

  If IsArray(mArray) = False Then
    SpecalFilter = False
    Exit Function
  End If
  
  lngNewElem = 0
  For irow = 1 To UBound(mArray, 1)
  
    'ここで、2列目と、3列目が空白であるかのチェックをしています。
    'ご希望の分岐ができているか確認してみてください。
    If mArray(irow, 2) = "" And mArray(irow, 3) = "" Then
      Exit For
    Else
      lngNewElem = lngNewElem + 1
    End If
  Next irow
  
  
  If lngNewElem = 0 Then
    mArray = Empty
    SpecalFilter = False
    Exit Function
  End If
  
  ReDim TmpArray(1 To lngNewElem, 1 To UBound(mArray, 2))
  For irow = 1 To lngNewElem
    For icol = 1 To UBound(TmpArray, 2)
      TmpArray(irow, icol) = mArray(irow, icol)
    Next icol
  Next irow
  
  mArray = TmpArray
  Erase TmpArray
  SpecalFilter = True
  Exit Function

HandleErr:
  MsgBox "エラーが発生しました。フィルタできませんでした。" & Err.Description
  Resume EndProc
EndProc:
On Error Resume Next
  Erase TmpArray
  SpecalFilter = False
End Function

'値をセルに上書きする
Public Sub Up(ByRef rRange As Excel.Range)
  
  If IsArray(mArray) = False Then
    Exit Sub
  End If
  
  With rRange.Resize(UBound(mArray, 1), UBound(mArray, 2))
    .value = mArray
  End With
End Sub

【8188】Re:複数のデーターを1つの表に
お礼  カオル  - 03/10/3(金) 0:51 -

引用なし
パスワード
   しのしのさん ありがとうございます
しのしのさんのコードでうまく行きました

色々ご迷惑をお掛けしましたが、最後まで付き合ってくださり。
感謝です。

12880 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free