[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白ならセルを削除し、左詰めに』(木葉)
おはようございます。毎度お世話になっております。
配車表というものを作るにあたり、1013年2月20日から2014年2月19日まで1日分ずつのシートが365枚と、その中から必要なデータを取り出した。 表(シート名「総合」)を1枚作成しました。
今回、新たにシート(シート名「検索」)を挿入し、ある数値を検索すると、 「総合」の中から該当する行を取り出し、表示するという関数を記入しました。
365枚分のシートの必要なデータは、セルの結合がされておりますので、 「総合」のシートでは、結合されたセルの先頭はそのまま文字として参照されますが、 結合された2列目以降のデータは、そのまま「0」として参照されてしまっています。 (例えば、A1からA4を結合していた場合、別シートに参照すると、A1にはそのままデータが、A2からA4には「0」が表示されます)
◆「総合」の表から、「0」の表示されている部分は削除し、左詰めにすることは可能でしょうか?
「総合」のB2からS13872までが、必要なデータを取り出している範囲であり、全て関数での表記です。
ちなみに、365枚のシートで、結合されているセルは、全て同じ列ではなく、FからS列を3等分されていたり、4等分されていたり・・・ と様々で、全てが同じ列に収まっていないので、列をそのまま削除することができないのです。
おそらく関数処理はできないと思いますので、マクロでの処理になるかもしれませんが マクロはモジュールを開いて、完成されている記述を少しいじる程度しかできません・・・
もしくは、「総合」の表の関数を変えて、空白セルは表示しないようにして左詰めに、 ということが可能であれば、そちらでも構いません。
よろしければご教示下さいませ。
【追記】「総合」の表は使わずとも、「検索」のどこかのセルに記入した時に、365枚のシートの中から検索し、その行を反映することが可能なら、 この作業のほうが効率はいいのでしょうか? 今の状況では、データ量が多いせいか、反映するのに5分強の時間がかかっています。
結合されている左上以外のセルは空白と同じ扱いですから、 =IF(参照先!A1="","",参照先!A1A1) のような関数にするのではダメでしょうか。 (Mook)
ご回答ありがとうございます! 教えていただいた式ですと、結合セルの1列目以外のセルのところは、空白セルとして返されますよね? 空白セルの場合は、その表示はせず、文字列のある部分だけをズラーっと並べたいのですが・・・ 難しいですかね・・・?
(木葉)
詰める処理の式は思いつかないのでマクロの例ですが、表示中のシートを詰めて 新規シートに結果出力しています。 (Mook)
Sub PackToLeft()
Dim srcWS As Worksheet
Set srcWS = ActiveSheet
Dim newWS As Worksheet
Set newWS = Worksheets.Add(before:=Worksheets(1))
Dim srcData
srcData = srcWS.Range("B2:S13872")
Dim dstData
dstData = newWS.Range("B2:S13872")
Dim r As Long
Dim c As Long
Dim dstC As Long
For r = 1 To UBound(srcData, 1)
dstC = 1
For c = 1 To UBound(srcData, 2)
If srcData(r, c) <> "" And srcData(r, c) <> 0 Then
dstData(r, dstC) = srcData(r, c)
dstC = dstC + 1
End If
Next
Next
newWS.Range("B2:S13872") = dstData
End Sub
ほとんど意味は分かっていないのですが、そのままコピペさせていただいたところ、
うまく表示されました!
私ももっと勉強してVBAにも挑戦したいと思います
貴重なお時間たくさんとらせてしまい、申し訳ないです。
本当にありがとうございました!
(木葉)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.