[[20141116093241]] 『指定行の最下行から転記』(ちぃさん) ページの最後に飛ぶ

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

 

『指定行の最下行から転記』(ちぃさん)

お世話になります。

指定行の最下行から転記させたいたいのですがマクロコードが思うようにすすみません。
どうか宜しくおねがいします。

Sheet1の「A10」より上の行から最下行の値をSheet1の「B列」の「B2」より最下行へ転記させたいのですが不足部分がある?ためなのか動きません。
F8で確認してもエラー表示はないのですが。。。。

現在マクロコードは

Sub Sample()

    Dim cp
    cp = Range("A10").End(xlUp).Rows '検索
    Range("B2").End(xlDown).Rows = cp '転記先
End Sub

としています。
素人的な記述で申し訳ありません。
どのように手直しをすれば動きますでしょうか。

どうかお助けください。
何卒宜しくお願いいたします。

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


想像ですが、こういうことでしょうか。

 cp = Range("A10").End(xlUp).Value '検索
 Range("B2").End(xlDown).Offset(1).Value = cp '転記先

(マナ) 2014/11/16(日) 10:15


 コード拝見しました。
 >不足部分がある?ためなのか動きません。 

 それは、そうなのでしょうねえ

 普通のデータがA,B列にあるのであれば

 Range("B2").End(xlDown).Rows = cp  'これがちょっと違うだけですが・・・。

 もっとも記述の仕方は修正した方がよいですが・・・。
 提示されたコードは、 実行するシート(A列、B列)のデータ配置によっても動作は異なります。

 以下の動作をおこなってください。

 セルA10を選択してください。この状態で Ctrl+↑ を押してください。

 この操作で選択されているセルは、B列に移行したいセルですが、ただしいですか?

 次にセルB2を選択してください。この状態で Ctrl+↓ を押してください。

 この操作で選択されているセルは、A列のデータを配置するセルですが、正しいですか?

 提示されたコードは、上記の操作と同じ位置を指しています。

 正しくないなら、現在のデータ配置まで記述してみてください、例えば、見ている値が実際には数式で
 設定されている場合も結果が違ってきます。
(ichinose) 2014/11/16(日) 10:19

(マナ) さん (ichinose) さん解答ありがとうございます。

(マナ) さんにご教授いただいたコード試してみたのですがエラーがでます。
実行時エラー'1004';
アプリケーション定義またはオブジェクト定義のエラーです。


このエラーが出るのは何か足らないのでしょうか?

(ichinose) さん申し訳ありません。
>セルA10を選択してください。この状態で Ctrl+↑ を押してください。
試してみたのですが間違いないと思います。
>次にセルB2を選択してください。この状態で Ctrl+↓ を押してください。
こちらも大丈夫だとおもっています。

マクロコードを
Range("B2") = Range("A10").End(xlUp).Rows '検索
に変更すれば
「A10」以上の行の最下行の値が「B2」に転記はされるのですが。。。。。

全く転記できない原因がわかりません。
(ichinose) さんの説明を取り違っていたら申し訳ありません。

(ちぃさん) 2014/11/16(日) 10:40


Msgboxに何が表示されるか理解出来ますか。また実際には期待通りですか。

 Sub test2()
    MsgBox Range("A10").Address(0, 0)
    MsgBox Range("A10").End(xlUp).Address(0, 0)
    MsgBox Range("A10").End(xlUp).Rows.Address(0, 0)
    MsgBox Range("A10").End(xlUp).Value
    MsgBox Range("B2").Address(0, 0)
    MsgBox Range("B2").End(xlDown).Address(0, 0)
    MsgBox Range("B2").End(xlDown).Rows.Address(0, 0)
    MsgBox Range("B2").End(xlDown).Value
 End Sub

(マナ) 2014/11/16(日) 10:57


 では、私が想定していた内容とは違いますね!!

 後は、このコードをどこのモジュールに記述されていますか?

 閲覧者は、特に記述がなければ 標準モジュールに記述されたコードだと思っています。

 シートモジュールに書かれたコードだと意図と違う場合がありますから、確認してください。

 これも標準モジュールに書かれたコードだというなら、もう少し調べていけば 解決するでしょう。

(ichinose) 2014/11/16(日) 11:37


 こういう問題は、ご自分のシートと同じシートを閲覧者に再現させる記述が必要なんです。
 実は、これがここのサイトを利用することでプログラミングが上達する近道なんです。

 まだ、再現できる記述がされていませんよね、だから、あーじゃないか、こーじゃないかと
 推測しなければなりませんよね?

 新規ブックにて、標準モジュール(Module1)に

 Sub mk_sample()
    With ActiveSheet
       With .Range("a1:a8")
          .Formula = "=row()"
          .Value = .Value
       End With
       With Range("b1:b12")
          .Formula = "=char(row()+64)"
          .Value = .Value
       End With
    End With
 End Sub

 上記のmk_sampleを実行してみてください。
 アクティブシートにサンプルデータが作成されます。

 実行後、提示された

 Sub Sample() 
    Dim cp
    cp = Range("A10").End(xlUp).Rows '検索
    Range("B2").End(xlDown).Rows = cp '転記先
 End Sub

 を実行してみてください。 正常ではないですが、惜しいところまで転記されていますよね?

 問題を抱えているシートやコードのどこが違うでしょうか?

(ichinose) 2014/11/16(日) 11:57


(マナ) さん (ichinose) さん解答ありがとうございます。 

沢山ありがとうございます。
すみません。
今チョット手元にPCがありませんので後で試させてください。

本当に申し訳ございません。

(ちぃさん) 2014/11/16(日) 12:04


遅くなり申し訳ありません。

>後は、このコードをどこのモジュールに記述されていますか?
説明不足で申し訳ありません。
シートモジュールに記述しています。

>Msgboxに何が表示されるか理解出来ますか。また実際には期待通りですか。
ご教授いただいたマクロコードを実行しました。
間違っているかもしれないですが
MsgBox Range("A10").Address(0, 0)⇒指定されている場所
MsgBox Range("A10").End(xlUp).Address(0, 0)⇒入力されている最下行の場所
MsgBox Range("A10").End(xlUp).Rows.Address(0, 0)⇒入力されている最下行の場所?
MsgBox Range("A10").End(xlUp).Value⇒入力されている最下行の値
MsgBox Range("B2").Address(0, 0)⇒指定されている場所
MsgBox Range("B2").End(xlDown).Address(0, 0)⇒転記されている最下行の場所
MsgBox Range("B2").End(xlDown).Rows.Address(0, 0)⇒転記されている最下行の場所?
MsgBox Range("B2").End(xlDown).Value⇒最下行に転記される値?

このような感じでしょうか?

>問題を抱えているシートやコードのどこが違うでしょうか?

あ。。。
今気づいたのですがB1048576に転記されてました。
何故でしょうか?

何が駄目なのどしょうか?

(ちぃさん) 2014/11/16(日) 16:38


連続投稿すみません。

やはり何度試しても
Range("B2").End(xlDown).Offset(1).Value = cp '転記先

ココで
実行時エラー'1004';
アプリケーション定義またはオブジェクト定義のエラーです。
が出るのですが。
Offset(1).←は1つ下のセルを選択するためには必要なのですね。
調べました。
でもエラーがでるのですが(汗)
何故でしょうか?

どうぞ宜しくお願いします。

(ちぃさん) 2014/11/16(日) 17:25


 B3 以降が空なのではないですか?

http://www.moug.net/tech/exvba/0050088.html

 の注意を見てください。

  >次のようなデータでは問題が発生します。
  >
  >(1)項目名だけでデータが無い
  >(2)最終行のデータまでの間に空白行がある
(Mook) 2014/11/16(日) 17:39


(Mook)さん 回答ありがとうございます。

「xlDown」を勘違いしていました。
確かに指摘された所が駄目でした(照)
B列は空白の状態でしたので 「B1048576」に転記されます。
勉強になりました。
時と場合によると思いますが転記元も転記先も「xlUp」のほうがいいのでしょうか?(汗)

それにしても何故
Range("B2").End(xlDown).Offset(1).Value = cp

でエラーがでるのでしょうか?
私自身が掲示したコード

 Range("B2").End(xlDown).Rows = cp
↑
では最下行への転記は出来ない事に気づきました。

何が不足しているのでしょうか?

もし良ければ助けて頂けないでしょうか。
宜しくお願いいたします。

(ちぃさん) 2014/11/16(日) 18:08


 やりたいことを整理してはどうでしょうか。

 「データがある最下行」の「次のセル」へ転記したいのであれば、
 「Range("B2").End(xlDown)」 の 「.Offset(1).Value 」 へ転記ですけれど、

 すでに問題になっているように、データが無い場合もあるのであれば、
 「Range("B" & Rows.Count).End(xlUp)」 の 「.Offset(1).Value 」 にしたらできないですか。

 >Range("B2").End(xlDown).Offset(1).Value = cp 
 でエラーが出るのは、今回はシートの最下行からさらに次の行(実在しない行)を
 指定しているからです。
(Mook) 2014/11/16(日) 18:14

(Mook)さん回答ありがとうございます。

素人すぎて失礼しました。

エラー原因も教えて頂きスッキリしました。
原因になかなか気づけず恥ずかしいです。

今回の質問内容からしますと解決したのですが、転記を始める転記先の位置を変更したい時はやはり別に記述が必要になるのでしょうか?

http://www.moug.net/tech/exvba/0050057.html

コチラを参考にする限りでは
Offset(1)⇒Offset(2)
に変更しても飛び飛びで転記されるのですが何か良い手立てはありますでしょうか。

手間を取らせて申し訳ありません。
どうか宜しくお願いいたします。

(ちぃさん) 2014/11/16(日) 18:51


 問題を考えるときには、なるべく論理の飛躍をなくすことが大切だと思います。

 >転記を始める転記先の位置を変更したい時は
 どのように変更するのですか?

 >やはり別に記述が必要になるのでしょうか? 
 どうして必要だと思うのですか?

 >コチラを参考にする限りでは
 どの部分を参考にしたのですか?

 >Offset(1)⇒Offset(2) 
 どうしてこう変更したのですか?

 この隙間は質問者が明確に説明しないと、回答者との祖語になり解決まで紆余曲折
 となる原因になります。

(Mook) 2014/11/16(日) 21:58


(Mook)さん 回答ありがとうございます。

説明不足すみません。

>どのように変更するのですか?
>どうして必要だと思うのですか?
最初に掲示しました元のコード
Range("B2").End(xlDown).Rows = cp '転記先
の「B2」は転記を「B2」から始めたかったからであります。
掲示していましたコードでこの転記先を仮に「B3」から始めたい場合に元のコードで解決していれば「B2」⇒「B3」に変更すればよいという考えから現在のコードであれば「別に記述が必要?」と思ったからです。
現在のコードは「B列」を選択するコードになっていますので。

> どの部分を参考にしたのですか?
>どうしてこう変更したのですか?
「例えば・・・

 ActiveCell.Offset(1, 0).Select
このコードはアクティブセルから行方向に1、つまり1つ下のセルを選択します。」
取り違えているので思うようになっていないのですが、(1, 0)が1行下であれば(2, 0)が2行下からだと思ったからです。プログラムの勉強をしている方やマクロに経験のある方でしたらありえない発想かもしれないですが私は素人ですのでこのように解釈しました。

この説明でわかりますでしょうか?

説明に理解できない部分がありましたらご指摘ください。

宜しくお願いいたします。

(ちぃさん) 2014/11/16(日) 22:44


 やはり推測が入ってしまいますが、
 B列はまったくの空で、B2、もしくは B3から開始したいということでしょうか。

 その場合は、xlUp  でも xlDown でも期待する位置は得られないので、初期位置を
 変更する記述を追加することになります。

 >Offset(1)⇒Offset(2) 
 は「得られたセルの一つ後」を「得られたセルの二つ後」とすることですから、
 最初の処理は良くとも、それから後が全部おかしくなってしまいます。

 基本、追記していくとおいう事は一つ後ろのセルですから、そこを変えるのではなく、
 得られたセルが先頭だったら、B2(もしくはB3)に変更する、という対応になると思います。

 cp = Range("A10").End(xlUp).Value
 Set nextCell = Range("B" & Rows.Count).End(xlUp).Offset(1)
 If nextCell.Row < 2 Then  '// 対象の行が 2行以下なら( B2 からの場合は 1 しかないですけれど)
    Set nextCell = Range("B2")
 End If
 nextCell.Value = cp

 のような形でしょうか。

 Range("A10").End(xlUp)や Range("B2").End(xlDown) は あくまでもそのセルからの
 Ctl+↑もしくは Ctl+↓ の操作ですから、実際の B2 や A10 からキー操作したら、
 どこに移動するかで確認できますから、やってみるのが良いと思います。
(Mook) 2014/11/17(月) 03:18

(Mook)さん 回答ありがとうございます。

お礼が遅くなり申し訳ありません。

事細かく説明をつけていただき助かります。

また理解できていなければ質問に参りますのでその際は指摘いただきたいです。

貴重なお時間を割いてお付き合いいただき感謝いたします。

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

(ちぃさん) 2014/11/17(月) 15:27


コメント返信:

[ 一覧(最新更新順) ]


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