[[20180911140925]] 『【マクロ】シート間の転記マクロ:オブジェクト変』(トイレの女神) ページの最後に飛ぶ

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

 

『【マクロ】シート間の転記マクロ:オブジェクト変数または With ブロック変数が設定されていません。』(トイレの女神)

こんにちは(._.)
シート間の転記マクロを作ったみたのですが
エラーになってしまったので
ご相談させて下さい!
(色んなとこから引っ張ってつないだり
マクロの記録を使って書き換えてみただけですが、、、。)

他にもシート間転記でうまくいっていないという
質問があったのですが
私のとはまた違ったものと感じたので
今回別スレ立てております。。。

もし既出の質問でしたら
ご容赦下さい(T_T)

下記にまとめてみましたので
解決策等ご教授いただけますと幸いです。
よろしくおねがいします!
(変数の型の指定って難しいですね、、、。)

★やりたいこと
シート1の3行目の見出し(項目名)を検索して1つ下のセルに入っているデータを5つコピーして
シート2の4行目の見出し(項目名)を検索して1つ下のセルに貼り付けたい

★書いたコード

 '変数でシートを指定
 Dim mori As Worksheet
 Set sutera = Worksheets("sheet1")
 Dim kaze As Worksheet
 Set pafu = Worksheets("sheet2")

'シート1からそれぞれ見出しの一つ下に入っているデータを取得
With mori
Set mituketa1 = .Range("3:3").Find(What:="割当", LookAt:=xlPart).Offset(1, 0).Select
Set mituketa2 = .Range("3:3").Find(What:="いつ", LookAt:=xlPart).Offset(1, 0).Select '書式はmmmm/yy/dd
Set mituketa3 = .Range("3:3").Find(What:="なぜ", LookAt:=xlPart).Offset(1, 0).Select
Set mituketa4 = .Range("3:3").Find(What:="状況", LookAt:=xlPart).Offset(1, 0).Select
Set mituketa5 = .Range("3:3").Find(What:="必要なもの", LookAt:=xlPart).Offset(1, 0).Select
End With

'シート2のそれぞれ見出しの一つ下にデータを貼り付ける場所を作る
With kaze
Set mituketa6 = .Range("4:4").Find(What:="割当", LookAt:=xlPart).Offset(1, 0).Select
Set mituketa7 = .Range("4:4").Find(What:="いつ", LookAt:=xlPart).Offset(1, 0).Select '書式はmmmm/yy/dd
Set mituketa8 = .Range("4:4").Find(What:="なぜ", LookAt:=xlPart).Offset(1, 0).Select
Set mituketa9 = .Range("4:4").Find(What:="状況", LookAt:=xlPart).Offset(1, 0).Select
Set mituketa10 = .Range("4:4").Find(What:="必要なもの", LookAt:=xlPart).Offset(1, 0).Select
End With

'変数がたくさんあるからまとめたい!!
Set beaf = Range("mituketa1 , mituketa2, mituketa3, mituketa4, mituketa5")
Set fish = Range("mituketa6 , mituketa7, mituketa8 ,mituketa9, mituketa10 ")

'コピーして貼り付け

 beaf.Copy
 fish.PasteSpecial Paste:=xlPasteValues

End Sub

★エラーになった箇所
Set mituketa1 = .Range("3:3").Find(What:="割当", LookAt:=xlPart).Offset(1, 0).Select

★出てきたエラー
実行時エラー'91'
オブジェクト変数またはWithブロック変数が設定されていません

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


★書いたコード
 '変数でシートを指定
 Dim mori As Worksheet
 Set mori = Worksheets("sheet1")
 Dim kaze As Worksheet
 Set kaze = Worksheets("sheet2")

の間違いです()
(トイレの女神) 2018/09/11(火) 14:12


 まずは
[[20180906130635]] 『【マクロ】データの重複の削除を行う』(トイレの女神)
 と同じくSelectを外した上でうまくいくか確認してくれ。
(ねむねむ) 2018/09/11(火) 14:18

ねむねむさん

いつもありがとうございます(*^^*)

まーた同じ間違いを、、、、
これで解決!と思ったのですが
同じようにオブジェクト変数またはWithブロック変数が設定されていませんの
エラーが出てきてしまいます...
(トイレの女神) 2018/09/11(火) 14:34


 mituketa1〜mituketa10はDim句でどのように定義しているのだろうか?
(ねむねむ) 2018/09/11(火) 14:37

書いている間に話が進んでしまったけど、投稿しておきます。

たぶん、前トピックから微妙に勘違いされたままなのでは?
気になっているのはココ
>なるほど、RangeとSelectでコードの意味が重複しているため エラーになっていたんですね、、、

もともと記述ルールとして 「オブジェクト」.「メソッド(命令)」という書き方が基本なのに、

前ピックのエラーになったコードでは
 ActiveSheet.Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select.RemoveDuplicates Columns:=(3), Header:=xlYes

つまり、コードの意味が重なってたというか「オブジェクト」.「メソッド(命令)」.「メソッド(命令)」とメソッドの後ろに「メソッドが重なっていた」のがおかしいです。
それでも、Excel君が頑張って実行しようとした結果、

ActiveSheet.Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select の結果であるTrueと解釈して

 True.RemoveDuplicates Columns:=(3), Header:=xlYes 

ってなってるから変ですよ。っていうのがねむねむさんの指摘だとおもわれます。

なので、今回もメソッドが重なっているので、そこを修正すべきです。

なお、Findメソッドを使用するのであれば、見つからなかった場合も考慮しておいたほうがいいですよ。
(※絶対に見つかるようにシートを構成しているなら別)

(もこな2) 2018/09/11(火) 14:57


んー、やりたい事はこんなのでしょうか?
 Sub test()
    Dim mori As Worksheet
    Dim kaze As Worksheet
    Dim vw As Variant
    Dim F As Variant
    Dim i As Long

    Set mori = Worksheets("sheet1")
    Set kaze = Worksheets("sheet2")

    F = Array("割当", "いつ", "なぜ", "状況", "必要なもの")

    For i = 0 To UBound(F)
        vw = mori.Range("C:C").Find(What:=F(i), LookAt:=xlPart).Offset(1, 0)
        kaze.Range("D:D").Find(What:=F(i), LookAt:=xlPart).Offset(1, 0) = vw
    Next i
 End Sub
(???) 2018/09/11(火) 15:17

書いている間に???さんがもっといいの投稿されてるけど、せっかくなので投稿しておきます。
発想は一緒でよね たぶん・・

    Sub 名無しのマクロ()
        Dim MyArr As Variant
        Dim src(4) As String
        Dim dst(4) As String
        Dim i As Long

        '変数でシートを指定(宣言した変数名とセットしている変数名が合ってないのを修正)
        Dim mori As Worksheet: Set mori = Worksheets("sheet1")
        Dim kaze As Worksheet: Set kaze = Worksheets("sheet2")

        MyArr = Array("割当", "いつ", "なぜ", "状況", "必要なもの")

        'シート1にあるコピー元のセル番地を取得
        For i = 0 To 4
            src(i) = mori.Range("3:3").Find(What:=MyArr(i), LookAt:=xlPart).Offset(1, 0).Address
        Next i

        'シート2にある貼付先のセル番地を取得
        For i = 0 To 4
            dst(i) = kaze.Range("4:4").Find(What:=MyArr(i), LookAt:=xlPart).Offset(1, 0).Address
        End With

        'ループ処理でValueプロパティを参照して、値コピーの実行
        For i = 0 To 4
            kaze.Range(dst(i)).Value = mori.Range(src(i)).Value
        Next i

    End Sub
(もこな2) 2018/09/11(火) 15:23

???さんのヒントをもとに、再考。
絶対にFindメソッドが失敗しないなら、これでいいような・・・

    Sub 名無しのマクロ弐()
        Dim buf As Variant

        For Each buf In Array("割当", "いつ", "なぜ", "状況", "必要なもの")
            Worksheets("sheet2").Range("4:4").Find(What:=buf, LookAt:=xlPart).Offset(1, 0).Value = _
            Worksheets("sheet1").Range("3:3").Find(What:=buf, LookAt:=xlPart).Offset(1, 0).Value
        Next buf

    End Sub

(もこな2) 2018/09/11(火) 15:32


ねむねむさん

本来であればなにか指定してあげたほうがいいとは思うのですが
イレギュラーでいろいろなものが入る可能性を考慮して
何も指定せずバリアント型で入るようにしています!
※もしかしてそれがいけない...?

型を指定してあげたのですが
それでもエラーは消えませんでした。。。
(念の為文字列:stringもvariantも両方指定してみました...)

もこな2さん

こんにちはm(_ _)m
ご丁寧にどうもありがとうございます!
メゾット(命令)を重ねたら混乱してしまうということ、
なんとなくわかったような気がします。。。
今回でいうとRangeとSelectのところでしょうか?
完全な凡ミスで書いていました :-(

>なお、Findメソッドを使用するのであれば、見つからなかった場合も考慮しておいたほうがいいですよ。
>(※絶対に見つかるようにシートを構成しているなら別)
上記アドバイスありがとうございます(*^^*)
今回は絶対見つかるようにシート構成しています!!
でも On Error Resume Nextを追加しておくほうが無難なのかも...
要検討ですね。。。

お返事を書いている間に
???さんからお返事が届いてしまったので
作っていただいたマクロは
このあと確認してみます!!

???さん

こんにちは(^_^)
いただいたコードだと列で検索してしまうので
行で使えるように直したところ動きました!!
大変助かりました!ありがとうございます(*^^*)

わがまま言って申し訳ないのですが
オートフィルタを使ってる場合も
転記できるようにしたくて、、、
可視セルのみに適用することってできますか、、、?

下記サイトを見つけて
vw = mori.Range("3:3").Find(What:=F(i), LookAt:=xlPart).Offset(1, 0).EntireRow.Hidden = False
kaze.Range("4:4").Find(What:=F(i), LookAt:=xlPart).Offset(1, 0).EntireRow.Hidden = False = vw
ってしてみたのですが何の解決にもなりませんでした...
(まあ無理くりつっこめばそうなりますよね)
https://oshiete.goo.ne.jp/qa/4256065.html

先日も別スレ[[20180906151104]]で可視セル云々言ってましたが
このブックとは異なるブックで全く異なる作業をしているため
上記スレ解決策では対応できませんでした()
(トイレの女神) 2018/09/11(火) 16:23


>書いている間に???さんがもっといいの投稿されてるけど、せっかくなので投稿しておきます。
>発想は一緒でよね たぶん・・

>???さんのヒントをもとに、再考。
>絶対にFindメソッドが失敗しないなら、これでいいような・・・

上記、どちらも???さんと同じ動きでした!
個人的には2つ目のマクロのほうが
見やすいので好きです(^O^)
(トイレの女神) 2018/09/11(火) 16:34


あ、3行目を検索で良かったのですね。 てっきり3列目と勘違いしてしまいました。

代入先が非表示なら、代入しても隠れて見えないだけで問題なので、非表示になるのは、代入元の方でしょうかね? もこな2さんのコードを逆輸入してみます。

 Sub test2()
    Dim buf As Variant
    Dim R As Range

    For Each buf In Array("割当", "いつ", "なぜ", "状況", "必要なもの")
        Set R = Worksheets("sheet1").Range("3:3").Find(What:=buf, LookAt:=xlPart).Offset(1, 0)
        If R.EntireColumn.Hidden = False Then
            Worksheets("sheet2").Range("4:4").Find(What:=buf, LookAt:=xlPart).Offset(1, 0).Value = R.Value
        End If
    Next buf
 End Sub
(???) 2018/09/11(火) 16:54

ちなみに、今度は応用したコードが EntireRow になっているので、非表示にするのは行なのでしょうか? それなら1つも代入しないだけですが、列を非表示にするのかな?、と思ったので、上のコードは列非表示を判定しています。
(???) 2018/09/11(火) 16:59

???さん
>代入先が非表示なら、代入しても隠れて見えないだけで問題なので、
>非表示になるのは、代入元の方でしょうかね?
マクロありがとうございます!!
コピー元、コピー先、どちらもフィルターがかかっています(';')

どちらのシートにも
オートフィルタを行にかけているので
非表示になるのは行ですね((+_+))

うまくいかなかったので
ちょっと改造してみましたが
これもうまくいかず、、、
ColumnをRowに変えても試したのですが
まあ違う動きをしますよね()

Sub test2()

    Dim buf As Variant
    Dim R As Range
  Dim Y As Range
    For Each buf In Array("割当", "いつ", "なぜ", "状況", "必要なもの")
        Set R = Worksheets("sheet1").Range("3:3").Find(What:=buf, LookAt:=xlPart).Offset(1, 0)
        If R.EntireColumn.Hidden = False Then
        Set Y = Worksheets("sheet2").Range("4:4").Find(What:=buf, LookAt:=xlPart).Offset(1, 0)
        If Y.EntireColumn.Hidden = False Then
        Y.Value = R.Value
        End If
    Next buf
 End Sub
(トイレの女神) 2018/09/11(火) 17:16

なんだか頭がこんがらがってきました、、、

変なこと言っているかもしれません、
ごめんなさい、、、()
(トイレの女神) 2018/09/11(火) 17:20


行非表示なら、何もコピーしなければ良い訳で、それなら以下になります。
 Sub test3()
    Dim buf As Variant

    If Worksheets("sheet1").Rows(4).Hidden = False Then
        For Each buf In Array("割当", "いつ", "なぜ", "状況", "必要なもの")
            Worksheets("sheet2").Range("4:4").Find(What:=buf, LookAt:=xlPart).Offset(1, 0).Value = _
            Worksheets("sheet1").Range("3:3").Find(What:=buf, LookAt:=xlPart).Offset(1, 0).Value
        Next buf
    End If
 End Sub

しかしこれだと、いったい何をしたいコードなのかさっぱり判りません。非表示だったら違う行をコピーしたかったりするのでは? それに、行が可変だとして、列は固定ならば、Findなぞしなくても、コピー先は決まっていませんか?
(???) 2018/09/11(火) 17:31


う〜ん
やりたいことがピンとこないですが、実はこういうことだったりします?
"sheet1"の3行目が項目行でオートフィルタが設定されており、かつ、抽出がかかっています
"sheet2"の4行目が項目行でオートフィルタで抽出されており、かつ、抽出がかかっています

この状態のときに、
"sheet1"のオートフィルタが設定されている範囲の”1行下”に"sheet2"で抽出されているデータの各項目列に対応するものをコピペしたい。

もし↑だとFindメソッドを使うアプローチ自体が方向違いな気がします。
(やるべきなのは、オートフィルタが設定されている範囲をしらべるとか、抽出件数を調べるとかになりそうな)

(もこな2) 2018/09/11(火) 17:49


書き忘れ

>>(※絶対に見つかるようにシートを構成しているなら別)
>上記アドバイスありがとうございます(*^^*)
>今回は絶対見つかるようにシート構成しています!!
>でも On Error Resume Nextを追加しておくほうが無難なのかも...
>要検討ですね。。。

On Errorでも間違いじゃないでしょうけど

    Sub test()
        Dim mituketa1 As Range
        Set mituketa1 = ActiveSheet.Range("3:3").Find(What:="割当", LookAt:=xlPart).Offset(1, 0)

        If mituketa1 Is Nothing Then
            MsgBox "Findメソッドが失敗しました"
        Else
            Set mituketa1 = mituketa1.Offset(1)
        End If
    End Sub

みたいに、Findメソッドは見つからない場合Nothingを返してくるので、それを使って判定する方法もあります。
(もこな2) 2018/09/11(火) 18:00


 >★エラーになった箇所 
 >Set mituketa1 = .Range("3:3").Find(What:="割当", LookAt:=xlPart).Offset(1, 0).Select 
 >★出てきたエラー 
 >実行時エラー'91' 
 >オブジェクト変数またはWithブロック変数が設定されていません 
 話が別の方向に行ってるようですけど(目的を果たす為に必要な事っぽいので、それ自体は良いんですけど)、
 質問の主旨である上記の件は、有効な回答が出てないみたいですけど、もう良いんですか?

 因みに(もこな2) 2018/09/11(火) 14:57 の
 >ActiveSheet.Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select の結果であるTrueと解釈して 
 >True.RemoveDuplicates Columns:=(3), Header:=xlYes 
 >ってなってるから変ですよ。っていうのがねむねむさんの指摘だとおもわれます。 
 >なので、今回もメソッドが重なっているので、そこを修正すべきです。 
 と言う回答は間違ってます。

 まずFINDメソッドで上記のエラーが出るのは、検索値が見つからないのが原因です。
 検索値が見つからない為、mituketa1 の中身が空なのでRangeアドレス情報を持っていない状態で、
 OFFSETしてるので、オブジェクトが無いのに範囲移動は出来ないと叱られています。
 条件の文字などが間違っていないか確認してください。

 因みに、ちゃんと検索値が見つかった場合にSelectを付けてると、
 実行時エラー13
 型が一致しません
 のエラーが出ます。
 これはSETでオブジェクトをメモリ上に格納して操作してるので、
 物理的にSelect(選択)すると言う行為が出来ない為です。

(sy) 2018/09/11(火) 22:25


 >これはSETでオブジェクトをメモリ上に格納して操作してるので、
 >物理的にSelect(選択)すると言う行為が出来ない為です。

 ちょっと言葉が変でした。
 以下に訂正。

 これはSETでオブジェクトをメモリに格納するタイミングなので、
 同時に物理的にSelect(選択)すると言う行為が出来ない為です。

(sy) 2018/09/11(火) 22:39


 イミディエイトウィンドウで
 ?range("A1").select
 と打つとTrueが返る。
 多分選択の可否が返るのだろう。

(ねむねむ) 2018/09/12(水) 10:24


 で、Setでオブジェクトの代入を行おうとしているのに論理値を代入しようとして型が一致していないとメッセージを出しているのだろう。
(ねむねむ) 2018/09/12(水) 10:26

 おっとこれじゃあすでに書いたことの繰り返しでしかないな。
 代入時の処理としてはまず、=の右辺を解決し、その結果を=の左辺に代入する。
 なので今回の場合で言えばセルの選択を行いその可否を代入しようとすることになる。

(ねむねむ) 2018/09/12(水) 10:54


 試しに
 Sub a()
     Dim aa As Range
     Set aa = Range("B1").Select
 End Sub
 を実行するとエラーにはなるがB1セルの選択は行われる。 
(ねむねむ) 2018/09/12(水) 10:56

お返事している間にねむねむさんからもお返事が...!

みなさんお返事ありがとうございます!
Syさんの説明が私の中で一番しっくりくる
丁寧な説明でした!ありがとうございました(*^^*)

一旦検索文字を簡単な漢数字にしたら
この部分は解決できました!
後ろに項目の名前の後ろに.が入っていたみたいです()

そこが通ったら今度は下記コードがエラーになりました。

★因数の数が一致していません、または不正なプロパティを指定しています

 Set beaf = Range("mituketa1 , mituketa2, mituketa3, mituketa4, mituketa5") 
 Set fish = Range("mituketa6 , mituketa7, mituketa8 ,mituketa9, mituketa10 ") 

→.Rangeに変更したところ、参照が不正または不完全ですとエラーが、、、
これってmituketaでRange使っているから命令が2重になっていて
エラーになっているということなのでしょうか。
でも今までのものをまとめるとOffsetで指定しても可視セルのみにならないので
このコード自体はもう使い物にならないですかね(T_T)

>"sheet1"の3行目が項目行でオートフィルタが設定されており、かつ、抽出がかかっています
>"sheet2"の4行目が項目行でオートフィルタで抽出されており、かつ、抽出がかかっています
>この状態のときに、
>"sheet1"のオートフィルタが設定されている範囲の”1行下”に"sheet2"で抽出されているデータの各項目列に対応するものをコピペしたい。

作業手順としては sheet2→1にコピー
sheet2の4行目が項目行で抽出がかかっていて項目行のひとつ下のセル(データの中では一番上にきているもの)を
sheet1に貼り付ける(sheet1の項目行は3行目で同じく抽出がかかっています。項目行のひとつ下のセルに貼り付ける)
どちらのシートもオートフィルタがかかっているため
セルの直接指定ではない方法を模索しています。
もしかしらたbeafとfishが逆かも、、、?
ちょっと私のあたまではキャパオーバーで
うまく考えられないですが
ここに書いた作業手順に則るようになればいいかなと、、、、

自分でももう少し模索してみます...

(トイレの女神) 2018/09/12(水) 11:05


既出ですけど、、そもそもオートフィルタの結果を抽出したいならやり方が違います。

ためしに、

 Sub TEST()
    MsgBox Range("B3").Offset(1, 0).Value
 End Sub

 これをフィルターがかかってないときと、フィルタがかかっているときで両方ためしてみてください
 同じ結果しか出ないはずです。

(TAKA) 2018/09/12(水) 11:25


2018/09/11(火) 14:57のコメントは、前回のことを言ったつもりだったけど、確かに”今回も同じ”とは言えないですね。フォローどもです。

また、↓はもともと変ですね。

 Set beaf = Range("mituketa1 , mituketa2, mituketa3, mituketa4, mituketa5") 
 Set fish = Range("mituketa6 , mituketa7, mituketa8 ,mituketa9, mituketa10 ") 

変数名のはずなのに文字列にしちゃってるから、無理やり解釈しようとしても、そういう名前のセル(範囲)探すようになりませんか?
もっと言えば、mituketa1〜mituketa10には何が格納されている(格納してほしかった)のでしょうか?

とりあえず、ねむねむさんが確認されている

 >mituketa1〜mituketa10はDim句でどのように定義しているのだろうか?

の返答がほしいですね。

例えば、セルそのものを格納する予定であったなら、こんな感じになるのでは?

    Sub test()
        Dim mituketa1 As Range, mituketa2 As Range, mituketa3 As Range
        Dim beaf As Range

        Set mituketa1 = Worksheets("sheet1").Rows(3).Find(What:="割当", LookAt:=xlPart).Offset(1)
        Set mituketa2 = Worksheets("sheet1").Rows(3).Find(What:="いつ", LookAt:=xlPart).Offset(1)
        Set mituketa3 = Worksheets("sheet1").Rows(3).Find(What:="なぜ", LookAt:=xlPart).Offset(1)

        Set beaf = Union(mituketa1, mituketa2, mituketa3)

    End Sub

2018/09/12(水) 12:26 追記

(もこな2) 2018/09/12(水) 11:42


>でも今までのものをまとめるとOffsetで指定しても可視セルのみにならないので
>このコード自体はもう使い物にならないですかね(T_T)

このことについては、少なくとも私にはやりたいことがどのようなことなのかわかってないので何とも言えないですね。
たとえば、"割当"の部分だけで言えば

 (1)手動で "Sheet1"の3行目が項目行としてオートフィルタを設定し、抽出もしておく。
 (2)手動で "Sheet2"の4行目が項目行としてオートフィルタを設定し、抽出もしておく。
 (3)マクロで、 "Sheet1"の項目行から"割当"の列を探す。
 (4)マクロで、 "Sheet2"の項目行から"割当"の列を探す。

とここまでは、推測できますけどそのあとが、マクロで実行するところは固定としても

 (5)"Sheet1"の対象列のうち1つ目のデータを、"Sheet2"の対象列のうち、項目行の1行下に上書き貼付する。
 (5)"Sheet1"の対象列のうち1つ目のデータを、"Sheet2"の対象列のうち、項目行の1行下に挿入する。
 (5)"Sheet1"の対象列のうち1つ目のデータを、"Sheet2"の対象列の一番下に追加するよう貼付する。
 (5)"Sheet1"の対象列のうち1つ目のデータを、"Sheet2"の対象列の抽出されているものの、1行下に上書き貼付する。
(5)"Sheet1"の対象列のうち1つ目のデータを、"Sheet2"の対象列の抽出されているものの、1つ下に挿入する。

みたいに、やりたいことがどれなのかよくわからないので回答できないです。

(もこな2) 2018/09/12(水) 12:48


図に起こしてみました!

sheet1

     |[A]         |[B]     |[C]   |[D] |[E]       |[F]        ← オートフィルタ
 [3] |名前        |割当    |いつ  |なぜ|状況      |必要なもの
 [4] |まだお      |なかよし|きょう|BB  |やってる  |スコップ  
 [5] |あぶらあげ  |ふなか  |きょう|    |やってない|きもち    
 [6] |おとうふ    |ふつう  |あした|CC  |やってる  |おつきさま
 [7] |きびだんご  |ふなか  |きのう|AA  |やってない|ひめ      
 [8] |おに        |なかよし|きのう|    |やってる  |そのほか  
 [9] |きみがよ    |ふつう  |あした|AA  |やってる  |          
 [10]|ほうれんそう|なかよし|きのう|DD  |やってない|みた      
 [11]|もりもと    |ふつう  |あした|    |やってる  |          
 [12]|まだお2     |ふなか  |きょう|BB  |やってない|          
 [13]|まだお3     |なかよし|あした|    |やってる  |うらない  

sheet2

     |[A]         |[B]     |[C]     |[D]   |[E] |[F]       |[G]         ← オートフィルタ
 [4] |名前        |何者    |割当    |いつ  |なぜ|状況      |必要なもの
 [5] |あぶらあげ  |たべもの|なかよし|あした|CC  |やってる  |かがみ    
 [6] |どりかむ    |ひと    |ふつう  |きのう|    |やってない|きぼう    
 [7] |くろれっつ  |もの    |ふなか  |あした|SS  |やってない|すいみん  
 [8] |おとうふ    |ひと    |ふなか  |あした|AA  |やってる  |ほんと    
 [9] |うみ        |もの    |ふつう  |きょう|MK  |やってない|なしごれん
 [10]|ほし        |もの    |ふつう  |きのう|II  |やってない|とまと    
 [11]|きびだんご  |たべもの|ふなか  |きょう|AA  |やってる  |まほう    
 [12]|ほうれんそう|うた    |なかよし|きのう|BA  |やってる  |けっけ    
 [13]|まだお      |ひと    |なかよし|きょう|BB  |やってる  |スコップ  
 [14]|おに        |ひと    |なかよし|きのう|    |やってる  |そのほか  
 [15]|きみがよ    |うた    |ふつう  |あした|AA  |やってる  |ぱそこん  
 [16]|もりもと    |ひと    |ふつう  |あした|    |やってる  |がむ      


sheet1 オートフィルタで抽出

    |[A]       |[B]     |[C]   |[D] |[E]       |[F]         ← オートフィルタ★"おとうふ"で抽出
 [3]|名前 ★   |割当    |いつ  |なぜ|状況      |必要なもの
 [6]|おとうふ  |ふつう  |あした|CC  |やってる  |おつきさま

sheet2 オートフィルタで抽出

     |[A]         |[B]     |[C]     |[D]   |[E] |[F]       |[G]       ← オートフィルタ★"たべもの"で抽出
 [4] |名前        |何者 ★ |割当    |いつ  |なぜ|状況      |必要なもの
 [7] |おとうふ    |たべもの|ふなか  |あした|AA  |やってる  |ほんと    
 [10]|きびだんご  |たべもの|ふなか  |きょう|AA  |やってる  |まほう    
 [12]|あぶらあげ  |たべもの|なかよし|あした|CC  |やってる  |かがみ    


作業手順
手動:オートフィルタで抽出する
マクロを使ってsheet1の[おとうふ]のデータをsheet2の[おとうふ]のデータで上書き
上書きする項目は"割当", "いつ", "なぜ", "状況", "必要なもの"
手動でオートフィルタを使うため常に一番上にくるデータのみコピペする

わかったこと
命令の重ね掛けは不可(Range、Select)
最初に質問したエラーは項目名に不備があり、見つけられなかったことによるエラー
#(文字を置き換えたらエラーが出なくなったが目視では違いわからず)
offsetは可視セル上の移動には適用されない
※項目名が見つからない可能性がある場合はエラー処理をする
項目名は固定されていないため今回はFindメゾットを使用→Findメゾットは使えない?????

(トイレの女神) 2018/09/12(水) 14:23


う〜ん やりたいことがよく理解できないけど、少なくとも ???さんが
>それに、行が可変だとして、列は固定ならば、Findなぞしなくても、コピー先は決まっていませんか?
って指摘されていますが、提示例だと指摘のとおり列が固定されているように見えるので、私もFindメソッドで探す意味がよくわかりません。

そのうえで、どちらのシートでもA列「名前」内で重複がないということであれば、Vlloup関数やMatch関数&Index関数でシート間参照すれば事足りそうな気がしますがどうなんでしょうか。
(もこな2) 2018/09/12(水) 16:51


これでどうでしょうか。。。

    Sub Macro1()
        Dim Ws1 As Worksheet, Ws2 As Worksheet, i As Long, j As Long
        Set Ws1 = Sheets("Sheet1")
        Set Ws2 = Sheets("Sheet2")

        With Ws1
            For i = 4 To .Cells(.Rows.Count, "A").End(xlUp).Row
                If .Rows(i).Hidden = False Then
                    For j = 5 To Ws2.Cells(Ws2.Rows.Count, "A").End(xlUp).Row
                        If Ws2.Rows(j).Hidden = False Then
                            Ws2.Cells(j, "A") = .Cells(i, "A").Value
                            Ws2.Cells(j, "C").Resize(1, 5) = .Cells(i, "B").Resize(1, 5).Value
                            Exit Sub
                        End If
                    Next j
                End If
            Next i
        End With
    End Sub

(TAKA) 2018/09/12(水) 17:44


これでどうでしょうか。。。
(一行いらないのがはいったの直しました汗)
(誰か編集の仕方おしえてくださいい)

    Sub Macro1()
        Dim Ws1 As Worksheet, Ws2 As Worksheet, i As Long, j As Long
        Set Ws1 = Sheets("Sheet1")
        Set Ws2 = Sheets("Sheet2")

        With Ws1
            For i = 4 To .Cells(.Rows.Count, "A").End(xlUp).Row
                If .Rows(i).Hidden = False Then
                    For j = 5 To Ws2.Cells(Ws2.Rows.Count, "A").End(xlUp).Row
                        If Ws2.Rows(j).Hidden = False Then
                            Ws2.Cells(j, "C").Resize(1, 5) = .Cells(i, "B").Resize(1, 5).Value
                            Exit Sub
                        End If
                    Next j
                End If
            Next i
        End With
    End Sub

(TAKA) 2018/09/12(水) 18:25


>(誰か編集の仕方おしえてくださいい)

 (1) 記事番号をコピー
 (2)「初めての方へ」をクリック
 (3) (e) [既存の書き込みに書き込む]機能 の最後の行のリンクをクリック
 (4) 記事番号をペーストして編集ボタンをクリック

編集にならず、記事そのものに飛んだときは、貼り付けた記事番号の後ろに変なスペース入ってないか再確認

(もこな2) 2018/09/12(水) 19:25


TAKAさんのを参考に、私も考えてみました。
研究材料にでもしてください。

    Sub test()
        Dim dstSH As Worksheet: Set dstSH = Worksheets("Sheet2")
        Dim MyRNG As Range, MyROW As Variant

        Stop

        With Worksheets.Add
            '作業用のシートを作成して、"Sheet1"の抽出状態をコピーする。
            Worksheets("Sheet1").AutoFilter.Range.Copy .Range("A1")

            For Each MyRNG In Intersect(.UsedRange, .UsedRange.Offset(1), .Columns("A"))

                'Match関数で"Sheet2"のA列のうち、どの行に検索値があるか調べる
                MyROW = Application.Match(MyRNG, dstSH.Columns("A"), 0)

                'Match関数で対象行が見つかって、かつ、対象行が非表示でなければコピペを実行
                If Not IsError(MyROW) And Not dstSH.Rows(MyROW).Hidden Then
                    MyRNG.Offset(, 1).Resize(, 5).Copy dstSH.Cells(MyROW, "C")
                End If

            Next MyRNG

            '作業シートの削除
            Application.DisplayAlerts = False
            .Delete
            Application.DisplayAlerts = True

        End With

    End Sub

※どちらのシートでもA列内で重複がないことが前提です。

(もこな2) 2018/09/12(水) 22:33


 最終的にやりたい事は、
 シート1の表から、オートフィルタなどで抽出した、任意の行の「割当〜必要なもの」の5列分のデータを、
 シート2の同じ名前のデータに編集したい。
 と言う事で間違いないですか?

 幾つか確認ですけど、
 1点目、シート1のデータ全てが対象では無く、あくまで任意で指定した1行分のデータだけを変更したい。
    と言う事ですか?
 2点目、シート1のデータは例図のように同じ名前は後ろに2や3と付けて、重複されないようになってますか?
 3点目、例図ではシート2のデータも名前に重複が無いですけど、実際のデータも重複なしですか?
    それとも「何者」の区分違いで同じ名前が存在しますか?
 4点目、シート1の方には、名前の後ろに2や3がついてるけど、シート2の名前にはついてない。
    またシートが逆で、同じようなパターンはありますか?

 確認事項が不明ですけど、両方のシートとも名前の重複は無い、且つ任意の1件のデータを書き換え、
 名前は完全一致で検索できるとしたら、以下のコードでも出来ます。
 シート1だけオートフィルタで1件のみ抽出した状態で実行です。
 (2件以上抽出されていたら一番上のデータだけ変更されます。)
 (シート2は何もしなくて良いです。) 
 Sub test()
    Dim i As Long

    i = Sheets("Sheet1").Range("A4:A1000").SpecialCells(xlCellTypeVisible).Row
    Sheets("Sheet1").Range("B:F").Rows(i).Value = Evaluate("=VLOOKUP(A" & i & ",Sheet2!A:G,COLUMN(C:G),0)")

 End Sub

(sy) 2018/09/13(木) 03:32


syさんが確認されているところの返答が気になりますが、
単純に
・いずれの表ともA列内で重複がない
・オートフィルタの状態は関係なしにSheet2にSheet1の内容を持ってくるだけ

ということであれば、↓をSheet2の該当セル(今回はC5)に入力して、行方向と列方向にそれぞれコピー(フィル)すれば、たとえ項目列が不定でも、わざわざマクロを使わなくても解決できるようにおもいます。

 =IFERROR(IF(INDEX(Sheet1!$A$3:$Z$100,MATCH($A5,Sheet1!$A$3:$A$100,0),MATCH(C$4,Sheet1!$A$3:$Z$3,0))="",
 "",INDEX(Sheet1!$A$3:$Z$100,MATCH($A5,Sheet1!$A$3:$A$100,0),MATCH(C$4,Sheet1!$A$3:$Z$3,0))),"")

syさんがVLOOKUP関数使っていたので、あえてINDEX関数にしてみただけなので、VLOOKUPのほうが良くない?というツッコミは無しで・・・

(もこな2) 2018/09/14(金) 09:45


 あれ!?
 皆さんシート2のデータを書き換えになってるけど、
 何か私が勘違いしてるのかな?
 >作業手順としては sheet2→1にコピー 
 >マクロを使ってsheet1の[おとうふ]のデータをsheet2の[おとうふ]のデータで上書き 
 これってシート1のデータを書き換えって意味と思ったんですけど?

(sy) 2018/09/14(金) 12:32


自分は、最初に提示されたものが
 Dim mori As Worksheet : Set mori = Worksheets("sheet1")
 Dim kaze As Worksheet : Set kaze = Worksheets("sheet2")

のときに

 With mori
  mituketa1〜5
 End With

 With kaze
  mituketa6〜10
 End With

 Set beaf = Range("mituketa1 , mituketa2, mituketa3, mituketa4, mituketa5") 
 Set fish = Range("mituketa6 , mituketa7, mituketa8 ,mituketa9, mituketa10 ") 

 beaf.Copy
 fish.PasteSpecial Paste:=xlPasteValues

という発想になっていたので、「sheet1」をコピーして「sheet2」に貼り付けたい と読んだけど実のところどうなんでしょね

(もこな2) 2018/09/14(金) 12:58


 VLOOKUPはともかく、ご提示の式は以下でも同じですよ。
 =IFERROR(INDEX(Sheet1!$B$4:$Z$100,MATCH($A5,Sheet1!$A$4:$A$100,0),MATCH(C$4,Sheet1!$B$3:$Z$3,0))&"", "")

(sy) 2018/09/14(金) 19:15


なるほど、ブランクをくっつければ0が表示されちゃう問題は回避できるんですね。
フォローありがとうございます。

(もこな2) 2018/09/15(土) 09:36


コメント返信:

[ 一覧(最新更新順) ]


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