[[20181031135002]] 『転記元の空白(式の結果』(ddd) ページの最後に飛ぶ

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

 

『転記元の空白(式の結果』(ddd)

度々お世話になります
以下のコードをA列最後まで
ではなくT列の最後までとするにはどのように指定したらいいのでしょうか
Dim x As Long
Dim y As Long
x = Range("T" & Rows.Count).End(xlUp).Row
このあたりを作成して
うまくネストすればいいのかと思ったのですが
思うようにいかず、ご教授頂けますと幸いです

■やりたいこと
A列3行目からT列最終列まで(全てに数式有り)を
結果が空白のものを飛ばして転記したい

Sub 転記()
Dim n As Long
Dim k As Long
Dim l As Long

k = Range("A" & Rows.Count).End(xlUp).Row
l = 1

For n = 3 To k

If Cells(n, 3) <> "" Then
Cells(l, 21) = Cells(n, 3)
l = l + 1

End If
Next n
End Sub

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


タイトルが途切れておりました
申し訳ありません

性格には転記元が空白(式の結果" ")の場合
飛ばして次の行を転記したいでした
(ddd) 2018/10/31(水) 15:22


 効率悪そうですが

 Sub 転記()

     Dim k As Long, l As Long
     Dim r As Range

     Application.ScreenUpdating = False

     k = Range("T" & Rows.Count).End(xlUp).Row
     l = Range("U" & Rows.Count).End(xlUp).Row

     For Each r In Range("A3:T" & k)
         If r.Value <> "" Then
            Cells(l, 21).Value = r.Value
            l = l + 1
         End If
     Next

     Application.ScreenUpdating = True

 End Sub
(bi) 2018/10/31(水) 15:31

bi様 ご回答ありがとうございます
試してみたところ、こちらの質問と式の改変が足りなかった事に気づきました
申し訳ありません

頂いた式ですとU列の1行目から空白行以外を全て
転記してくれるものだと思うのですが
実際にはU列3行目からAN列までを使い
空白行を除き、横も含めて複製したい
例)A3〜T3の横一列=U3〜AN3の横一列に転記されるイメージです

 A   B  C  …  T       U   V   W … AN
3桃  蜜柑 林檎   梨     3 桃  蜜柑 林檎   梨   
4                   4 西瓜  苺  葡萄  無花果
5西瓜  苺  葡萄  無花果  → 5 白桃 黄桃 檸檬   栗
6                   
7白桃 黄桃 檸檬   栗      

(ddd) 2018/10/31(水) 16:51


こんばんは 関数ですが 

U列を作業列として可能なら

U3:=IF(A3="","",COUNTIF($A$3:A3,"<>")) 必要分 下にコピー

V3:=IF(MAX(Sheet1!$U$3:$U$1000)<ROW(A1),"",INDEX(Sheet1!A$3:A$1000,MATCH(ROW(A1),Sheet1!$U$3:$U$1000,0)))

必要範囲 下・右にコピー
 
(嘱託社員) 2018/10/31(水) 17:55


嘱託社員様 ご回答ありがとうございます
こちらの関数試させて頂いたのですが
こちらですと元のセルに空白判定のif式が入っているため
空白をみなされずそのまま全てが転記されてしまう形となっておりました

元の質問内で全てに数式が入っているという文言が
わかりにくかったかもしれませんね
せっかくご回答頂けたのに申し訳ありません
(ddd) 2018/10/31(水) 18:27


すみません、よく読んでませんでした。
素人コードですが試してください。

>元のセルに空白判定のif式が入っているため
空白とみなされず・・・
空白行はないということなら無理かもですが。。

Sub 転記()

   Dim i As Long, n As Long
   n = 3
      For i = 3 To Cells(Rows.Count, "t").End(xlUp).Row
      If Cells(i, "a").Value <> "" Then

         Cells(n, 21).Resize(1, 20).Value = Cells(i, 1).Resize(1, 20).Value
          n = n + 1
      End If
   Next
End Sub

(嘱託社員) 2018/10/31(水) 19:08


2018/10/31(水) 16:51 に提示された例を見ると、空欄の場合は、1行まるごと空欄になっている(数式で""が入ってる)ようにみえますけど、その理解でよいですか?

↑の理解であってるなら、

 (1)A3〜T列最終行までのセル範囲にオートフィルタをかけて、
 (2)どの列でもよいので空白行以外を抽出して
 (3)抽出されたものを一括してコピーし、U3セルに貼り付け

っていう操作を、「マクロの記録」機能を使って、エクセル君にたたき台となるコードを作らせ、
そのたたき台をもとに、整理してみてはどうでしょうか。

(もこな2) 2018/11/01(木) 01:10


 すごい勘違いをしていたみたいですみません。
 16時51分の投稿内容では特定の行ごとが空欄になっているようですが、もし行ごとなら
 T列の最終行ではなくA列の最終行を取得してもよさそうですよね。
 特定の行すべて空欄というわけではないのですか?
(bi) 2018/11/01(木) 08:39

おはようございます
深夜にもご連絡いただきましてありがとうございます
まとめての返信にて失礼いたします

嘱託社員様
度々ありがとうございます
そうですね、やはり空白行もそのまま転記されてしまいました

もこな様
ご返信ありがとうございます
そちらの認識で問題ございません
エクセル自体にあまり詳しくなくて恐縮なのですが
オートフィルタを元に作成した場合
仮に最終行の範囲が増える(今後追加される)場合は
作り直しになってしまう形でしょうか?

bi様
度々ありがとうございます
とんでもございません
こちらこそ説明が足りず申し訳ありませんでした

空白(に見えるif式)はA〜J,K〜Tで中身が別れており
どちらかだけが空白で一方には入っているというパターンがあります

と書いていて思ったのですが
そもそも範囲的には2つに分けるべきでしたね…
データの入っている部分全体で考えていたのでそこまで頭が回っておりませんでした
何度も申し訳ありません
(ddd) 2018/11/01(木) 10:49


 なるほど、範囲が2つに分かれているんですね。いいマクロとは言えませんが

 Sub 転記()

     Dim LastRow As Long

     Application.ScreenUpdating = False

     LastRow = Range("T" & Rows.Count).End(xlUp).Row

     Range("U3:AN" & LastRow).Value = Range("A3:T" & LastRow).Value

     Range("U3:AD" & LastRow).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
     Range("AE3:AN" & LastRow).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp

     Application.ScreenUpdating = True

 End Sub
(bi) 2018/11/01(木) 15:18 修正15:20

 bi さんへ

 >いいマクロとは言えませんが

 私のレベルですと、「いいとは言えない」と言う個所が分からないです。

 どの辺りが気になるのか教えて頂けませんか?

(半平太) 2018/11/01(木) 17:14


bi 様
何度もありがとうございます
仕事の合間に拝見しているもので返事が遅くすみません

試させて頂いたところ
以下のエラーがでました

実行時エラー'1004':
該当するセルが見つかりません

デバックボタンをおすと以下が黄色くなりました

Range("U3:AD" & LastRow).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp

なにか私の伝え忘れ等での問題でしたでしょうか…
ちなみに結果自体は出ていて
空白を含めた値が(つまり空白もそのまま)最終まで出力されておりました
(ddd) 2018/11/01(木) 18:26


 エラーの原因は空白セルが存在しない為です。
 xlCellTypeBlanksは空白セルを指定してますので、
 スペースの入ったセルは対象外になるので、
 該当セルがない。のエラーになってるんです。

 >空白(式の結果" ")
 言葉の違いが原因ですね。
 ご提示の" "は見た目は空白に見えますが、半角スペースの文字になってます。
 空白は""と間に何もない、長さ0の文字列の事を指します。

 現在の式中の" "を全て""に変えればbiさんのコードで出来ると思います。

(sy) 2018/11/01(木) 18:55


 半平太さん
 関数でもマクロのコードでも私が回答した後にもっとすっきりとしたものや効率のいい
 コード等が他の回答者さんから提示されることが数えきれないほどあって、もしかしたら
 今回ももっと効率のいい方法があるのかも…と思いそのように書いてしまいました。

 dddさん
 syさんが書かれているように実際は" "なのでしょうか?
 最初にdddさんが書いたコードの中に Cells(n, 3) <> "" とあったので""だと思って
 いたのですが。
(bi) 2018/11/02(金) 08:29

>オートフィルタを元に作成した場合仮に最終行の範囲が増える
>(今後追加される)場合は、作り直しになってしまう形でしょうか?
 答えることは簡単ですけど、試せばわかるとおもいますので、とりあえずdddさんへの宿題にします。
 試してみてわからないのあれば(うまくできないのであれば、どううまくできないのかも一緒に)
 その旨、追加質問すると私でなくてもあっというまに回答が付くようにおもいます。

>SpecialCells(xlCellTypeBlanks)

 「A列3行目からT列最終列まで(全てに数式有り)」とのことですから、極端なことを言えば「=""」
 みたいな数式が入っていて、値としてはsyさんがおっしゃるように「0文字の【文字列】」と推測します。

 そうなると、「SpecialCells(xlCellTypeBlanks)」ではなく「SpecialCells(xlCellTypeFormulas, xlTextValues)」
 で掴むと言うことなりそうですけど、それはそれで、0文字なのか、1文字以上なのか分けることができないように
 おもいます。

 ちなみに、値貼り付けしたら「SpecialCells(xlCellTypeBlanks)」で拾えないかな〜とおもってテストしてみましたが
 「=""」を値貼り付けしても空白セルではなく、定数の文字列になってますね(テスト環境:Win7 & Excel2013)

また、以下の部分矛盾してますけど、どっちですか?

 >>1行まるごと空欄になっている(数式で""が入ってる)ようにみえますけど、その理解でよいですか? 
 >そちらの認識で問題ございません

 >空白(に見えるif式)はA〜J,K〜Tで中身が別れており 
 >どちらかだけが空白で一方には入っているというパターンがあります

(もこな2) 2018/11/02(金) 10:19


sy 様
bi 様

ご返信ありがとうございます
sy様のおっしゃる通り式のほうが微妙に間違っておりました
転機するもとのセルには以下のような式が入っているのですが
IF('参照元'!M4<>"",'参照元'!M4,"")
実際には偽の場合の""にスペースが入っている状態でした
申し訳ありません

こちらをご指摘通り置き換えたところ無事動きました
私の知識・説明不足で何度もご面倒をおかけしたにも関わらず
連日お付き合い頂きましてほんとにありがとうございます
改めて感謝申し上げます。

またbi様は他の方の回答等をお気になさっているようですが
私のようにまだ自分で作ることも満足できず、ご指導いただく身からすれば
たとえどんな内容だとしてもご回答いただけるだけでありがたく
これらを一から作ることができるというその知識と努力にこそ価値があると思います
また今回は本当にたどり着きたい形を示して頂けて、感謝に堪えません。
あまり深く気になさらず、ご自分に自信を持って回答して頂けたらと思います
きっと私のように救われる人が多くいるはずですから

もこな2様
行数が多く私が担当していなかったデータもあったため
すべてを把握していなかったのですが
1行まるまる空白ではない(欠けのある)セルもあったようでした
そちらは詰めてしまうと問題なのでこちらで別の方法で対処し
無事に希望の形にできましたので
(ddd) 2018/11/02(金) 13:08


コメント返信:

[ 一覧(最新更新順) ]


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