AIと戦って、あなたの人生のリスク診断 >>

マクロで抽出したデータ(複数のブック)を他のブックに貼りつけようとしてるのですが、抽出結果が何も無い場合に抽出元データのコピー範囲以外が貼りつけられます。

具体的には、
ブックが2つ(①、②)
抽出条件は日付が2018/11/14~2018/11/19のデータ
コピーはAの3行目からと指定してます。

(貼りつけ元データ①)
  A    B     C
1
2(№) (日付)  (氏名)
3 1  2018/11/14  佐藤 
4 2  2018/11/22  小川

(貼りつけ元データ②)
  A    B     C
1
2(№) (日付)  (氏名)
3 1  2018/10/15  田中 
4 2  2018/12/03  鈴木

(抽出結果)
  A    B     C
1
2(№) (日付)  (氏名)
3(№) (日付)  (氏名)
4 1  2018/11/14  佐藤

全てに抽出条件に該当するデータがある場合はキレイに貼りつけられます。

マクロ初心者です。
もしかしてコピーの設定の仕方が間違ってるのでしょうか。

ws2.Range("A3", ws2.Cells(Rows.Count, 1).End(xlUp)).Resize(, 8).Copy R

調べても分からなかったです。
どなたか知識のある方、教えて下さい。

よろしく お願いいたします。

A 回答 (2件)

No.2です。



>抽出結果に必ずしもA3があるとは限らないのでA3指定は難しいかもです。

SQLServerカテで質問しているのでてっきりSQL文で取り出したデータをシートに貼り付け、その後の話かと思いましたが・・・
もしかしてExcelのAutoFilterでの話でしょうか?

そうすると『可視セル』を選択してコピー元とする方法になりますよ。

オートフィルタを使い倒す
http://officetanaka.net/excel/vba/tips/tips155c. …
・タイトル行を除いてコピーする

タイトル行についてはVBAで2行目に直接書き込んでしまう(列数にもよりますが)方法と、
コピー先のA2が空白の時だけコピー元の2行目のみをコピペするIf文を作成するか等ですかね。
    • good
    • 0
この回答へのお礼

説明が不足してましたら申し訳ございません。
まさに、マクロの抽出です。

1行ずらしてコピーしてみようと思います。
でも そうすると見出しを後でつけなくては(笑)

参考になりました。
丁寧な説明どうも ありがとうございます。

お礼日時:2018/12/03 09:49

>抽出結果が何も無い場合に抽出元データのコピー範囲以外が貼りつけられます。



ようするに3行目にデータがないから2行目が最終行【ws2.Cells(Rows.Count, 1).End(xlUp)により】となって貼り付くのでしょ???

ならIf文で

If ws2.Range("A3") <> "" Then
ws2.Range("A3", ws2.Cells(Rows.Count, 1).End(xlUp)).Resize(, 8).Copy R
End If

と取り敢ずA3セルが空白でなければ実行するとか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

コピーのマクロをA3からとしていたのですが、抽出結果全てが選択されているようです。

抽出結果に必ずしもA3があるとは限らないのでA3指定は難しいかもです。

勉強になりました。
次回の参考にさせて頂きます。

お礼日時:2018/12/03 09:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Q複数ブックを別のブックのひとつのシートにまとめたいです。

同じファルダ内にある複数のブック(依頼リスト)を日付と時間で抽出して、別のブックのひとつのシートにまとめたいです。

ブックは依頼者ごと(6つ)になっており、まとめたい情報はA列~G列、11行目からスタートです。
毎日更新され、1日に入力される依頼はいくつか不明です。
但し、依頼リストは全部で1人50個までしか入力できません。

A列  B列  C列  E列~G列
№   日付 時間  依頼内容等

ボタンをクリックすると、指定した期間(日付・時間)の6人の依頼をひとつのシートにまとめたいです。
例えば、11/14分(11/13の16:31~11/14の16:00まで)。
期間を指定するごとにシートが増えていくようにしたいです。

さらに指定で抽出されたら、元のデータ(6つのブック)のH列に「✔」をつけたいです。

マクロ初心者です。
色々調べて自分なりにやってみましたが、ひとつにまとまりません。

分かりにくい説明ですいません。
どなたか詳しい方がいらっしゃいましたら 教えてもらえないでしょうか。
よろしく お願いいたします。

同じファルダ内にある複数のブック(依頼リスト)を日付と時間で抽出して、別のブックのひとつのシートにまとめたいです。

ブックは依頼者ごと(6つ)になっており、まとめたい情報はA列~G列、11行目からスタートです。
毎日更新され、1日に入力される依頼はいくつか不明です。
但し、依頼リストは全部で1人50個までしか入力できません。

A列  B列  C列  E列~G列
№   日付 時間  依頼内容等

ボタンをクリックすると、指定した期間(日付・時間)の6人の依頼をひとつのシートにまとめ...続きを読む

Aベストアンサー

続けてお邪魔します。

>やはりグルグルするだけで
>完了BOXも出なくなってしまいました。

結局ファイル形式は「xlsx」で良いようなので、一番最初に帰ってみてはどうでしょうか?

お手元のVBE画面のコードをすべて消去し、
もう一度No.2のコードをそのままコピー&ペーストしてマクロを実行してみてください。

※ 最初の段階ではメッセージボックスだけは表示された!というコトなので
何らかの結果が出るかもしれません。

当然のコトですが、
>myPath = ThisWorkbook.Path & "\"
としているので、
コード記載のブックは他の6つのブックと同じフォルダ内に保存している!という前提です。
(コード記載のブックを保存していない場合は「パス」そのものが存在しません)

保存していない場合は
一旦コード記載のブックを同じフォルダに名前を付けて保存し、
再度開いてからマクロを実行してみてください。m(_ _)m

QVBA For next がうまいかない

Private Sub CommandButton1_Click()
Dim i As Integer
Dim j As Integer

For i = 19 To 27
For j = 7 To 19 Step 2

Workbooks("A").Worksheets("B").Cells(j, 19).Value = _
Workbooks("C ").Worksheets("D").Cells(i, 5).Value
Next
Next

End Sub
としているのですが、Book CのシートDのE19のものがBook AのシートB S19~S27にすべて同じ文字が入ってしまいます。
Book CのシートD S19~S27をBook AのシートBのS19~S27に上から順に表記させたいのですが何が間違ってますか?

Aベストアンサー

> 一瞬だけ表示させたいように表記されるのですが質問のようになってしまいます。
ということは、一度は正しく値の取得および設定が行われているということですよね。
そしたら、他の処理でなんかやらかしてるんじゃないですか?
イミディエイトウィンドウ、ウォッチ式を駆使して、値がおかしくなる特定のセルについて、値の動向を調べてみたら分かるのでは。

QMicrosoft Word グリッド線について Wordで文字のフォントサイズを12ポイントに設定

Microsoft Word グリッド線について

Wordで文字のフォントサイズを12ポイントに設定した時、グリッド線と文字を合わせる方法は無いでしょうか…
お教えお願いします

Aベストアンサー

ページ設定>文字数と行数の指定>原稿用紙の設定にすればいいと思います。

Qパソコンに詳しい方お願いします。 会社のパソコンですが、朝、電源を入れて、インターネットにアクセスし

パソコンに詳しい方お願いします。
会社のパソコンですが、朝、電源を入れて、インターネットにアクセスしたら繋がらなくて、調べたらDNSサーバのアドレスが勝手に変わってました。
こんなことあるのでしょうか??

Aベストアンサー

書き変わる事は良くあります。
ただ、その原因は色々で、例えばツール(フレッツ接続ツールの様な公式の物でも)によって書き変わる場合もあります。
マルウェア対策(ウィルス・セキュリティ対策)がもしもされていない場合はマルウェアによる書き換えの可能性もない訳ではありません。

Q行の削除について、ご教授お願いします 商品No.と商品枠No.が列上に入力されています 指定した商品

行の削除について、ご教授お願いします
商品No.と商品枠No.が列上に入力されています
指定した商品No.を検索して、その商品No.の商品枠が入力されているセル間の行を削除したいです
実際、下記のコードを試しましたがうまくいけません
Option Explicit
Public Sub 行削除()
Dim maxrow As Long
Dim wrow As Long
Dim v As Long
Dim s As Long
Dim b As Variant
Dim c As Variant
Dim shohin As String
maxrow = Cells(Rows.Count, "E").End(xlUp).Row
shohin = Cells(2, "J").Value
v = Cells(3, "J").Value
s = Cells(4, "J").Value

For wrow = 7 To maxrow
If Cells(wrow, "E").Value = shohin Then
If Cells(wrow, "L").Value = v Then
If Cells(wrow, "L").Value = s Then Exit For
End If
b = Cells(wrow, "L").Address(False, False)
c = Cells(wrow, "L").Address(False, False)
Next

Cells("b:c").Value.EntireRow.Clear
MsgBox ("完了")
End Sub

行の削除について、ご教授お願いします
商品No.と商品枠No.が列上に入力されています
指定した商品No.を検索して、その商品No.の商品枠が入力されているセル間の行を削除したいです
実際、下記のコードを試しましたがうまくいけません
Option Explicit
Public Sub 行削除()
Dim maxrow As Long
Dim wrow As Long
Dim v As Long
Dim s As Long
Dim b As Variant
Dim c As Variant
Dim shohin As String
maxrow = Cells(Rows.Count, "E").End(xlUp).Row
shohin = Cells(2, "J")...続きを読む

Aベストアンサー

No.2のお礼について。

追加質問内容から
・Range型変数
・Range型変数のセット(Set ステートメント)
はご存じとして回答します。

>If Not b Is Nothing And Not c Is Nothing Then

Range型変数の b 及び c にRange型がセットされているか(初期値はNothing)を判定してます。
本来If文の判定に多く用いられるのは『=』ですが、Range型の場合は『Is』が用いられます。
すなわちb及びcがNothing(未だ目的の値が見つからずSetステートメントによりセルがセットされていない)であるかを判定してます。

今回の場合はセットされていればFor文を抜け出したいので
Not b Is Nothing
・・・変数:bがNothingではない(Not)場合をTrueと判定します。
また変数:cにもセットが行なわれている事(2つのセルが確認された事)を条件にしたいので、『And』で繋いでいます。

>Set ○ = Nothing

本来マクロの実行が終了すれば変数はメモリから解放されるとの事ですが、
昔からのSetステートメントで宣言しセットされた変数は初期値に戻すようNothingで締めくくるのが定番になっています。

私自身はそのハッキリとした解説・理由は不明でありますが、過去に教わってきた諸先輩のコードを参考にいつも書いています。(曖昧でごめんなさい)

No.2のお礼について。

追加質問内容から
・Range型変数
・Range型変数のセット(Set ステートメント)
はご存じとして回答します。

>If Not b Is Nothing And Not c Is Nothing Then

Range型変数の b 及び c にRange型がセットされているか(初期値はNothing)を判定してます。
本来If文の判定に多く用いられるのは『=』ですが、Range型の場合は『Is』が用いられます。
すなわちb及びcがNothing(未だ目的の値が見つからずSetステートメントによりセルがセットされていない)であるかを判定してます。

今回の場...続きを読む

QInputBoxのType8でセルを選択する時、アクティブなセルの選択マークが消えない

いつもお世話になります

今、UserFormからInputBoxのType8を使ってセル範囲を指定して処理するプログラムを開発し使っていますが、社内Userから添付ファイルの様に今アクティブなセルのマークが消えないと言われて苦慮しています
消えないもなのでしょうか?

On Error Resume Next
Set Target = Application.InputBox("セルを選択してください", Left:=500, Top:=100, Type:=8)
If Err.Number > 0 Then
'..キャンセル時
Exit Sub
End If
TargetAdd = Target.Address
TextBox6.Text = TargetAdd


もし消す方法や、通常のセル選択時ような動きが出来ることが出来るのであれば教えてください
以上、よろしくお願いいたします

Aベストアンサー

こんにちは。

おっしゃっている現象を再現できました。
ただ、それは、UserForm 起動時の問題で、イメージがそこに残ってしまいますので、カモフラージュのようなものです。

そこで、ひとつ目は、

'UserForm 起動時か、InputBox を出現させる時か、もしくは両方で、このようなコードを入れます。添付画像ですと、画面の左上隅に行きます。

ActiveWindow.VisibleRange.Cells(1).Select 
On Error Resume Next
Set Target = Application.InputBox("セルを選択してください", Left:=500, Top:=100, Type:=8)

ふたつ目は、同じく以下のようにしてみますと、こちらが想像していたのとは違い、UserFormの下に隠れるようです。隠れた後のマウスカーソルは、動かしても、イメージが残らないようです。

With ActiveWindow.VisibleRange
  .Cells(.Cells.Count).Select
End With

ちょっと試してみてください。ふたつ目のほうが良いようです。

こんにちは。

おっしゃっている現象を再現できました。
ただ、それは、UserForm 起動時の問題で、イメージがそこに残ってしまいますので、カモフラージュのようなものです。

そこで、ひとつ目は、

'UserForm 起動時か、InputBox を出現させる時か、もしくは両方で、このようなコードを入れます。添付画像ですと、画面の左上隅に行きます。

ActiveWindow.VisibleRange.Cells(1).Select 
On Error Resume Next
Set Target = Application.InputBox("セルを選択してください", Left:=500, Top:=100, Type:=8)

ふ...続きを読む

Q毎月送られてくるエクセルデータから、その月の日数の間隔でデータを抽出する方法

エクセルデータで縦に日数、横に時間で日にち別時間別データが顧客の数だけ1つのシートにまとめて送られてきます。

そのデータがA1からW300まであったとすると、11月は30日までなので、1番目の顧客のデータではW30のセルの値がその月の合計値とします。次の顧客の合計値は日数の間隔なのでW60になります。あとは30行毎に各顧客の合計値があります。

現在は月によって行数の間隔が違ってくるので、結局毎月手作業で数値を拾うことになっています。

このように、月によって変動する間隔でも、顧客の合計値を抽出する関数はないでしょうか?その月の日数を決まったセルに入力すれば、算出できるという数式でもかまいません。
宜しくお願いします。

Aベストアンサー

一つずつ手作業で確認をするとき、どんな手順で処理をしていますか?
その手順通りにマクロなり関数なりを記述すれば良いのです。

11月は30日まで…をどうやって調べたらいいのか分からない。
ということであれば「12月1日の1日前が11月の末日」であることを利用すれば良い。
11月の翌月の1日から1日前の日付を求めれば良いってこと。
これは、うるう年でも正確に日数を求めてくれるので便利です。
 =DAY(”2018/12/1”-1)
 =TEXT(”2018/12/1”-1,"dd")
とでもしてみてください。
”2018/12/1”の1日前の日付けを表示してくれます。
2018/12/1の部分は
 DATE(2018,11+1,1)
としても良いでしょう。
「2018年11月の翌月の1日」
ってことです。
さらにこのまま引き算を省略するために
 DATE(2018,11+1,0)
としても良いでしょう。
するとこうなります。
 =DAY(DATE(2018,11+1,0))
 =TEXT(DATE(2018,11+1,0),"dd")

年(2018)と月(11)がデータのどこか決まったセルに入力されているなら、
そのセルを参照させれば毎月決まった処理をさせることができます。

これで11月は「30日(30行)」毎にデータが並ぶと判断させられます。

・・・
のように一つずつ不明点を解決しながら処理方法を考えましょう。
 「代わりに作って」
は【疑問の解決】ではなく、単なる【作業依頼】です。



・・・余談・・・
ちなみに自分ならW列のデータを30行毎に拾う場合は
OFFSET関数か、INDIRECT関数を使って拾います。

OFFSET関数の場合
1件目
 =OFFSET(W1,DAY(DATE(2018,11+1,0))*1-1,0,1,1)
2件目
 =OFFSET(W1,DAY(DATE(2018,11+1,0))*2-1,0,1,1)
3件目
 =OFFSET(W1,DAY(DATE(2018,11+1,0))*3-1,0,1,1)

100件目
 =OFFSET(W1,DAY(DATE(2018,11+1,0))*100-1,0,1,1)

INDIRECT関数の場合
1件目
 =INDIREXT(”W"&DAY(DATE(2018,11+1,0))*1)
2件目
 =INDIREXT(”W"&DAY(DATE(2018,11+1,0))*2)
3件目
 =INDIREXT(”W"&DAY(DATE(2018,11+1,0))*3)

100件目
 =INDIRECT(”W"&DAY(DATE(2018,11+1,0))*100)

一つずつ手作業で確認をするとき、どんな手順で処理をしていますか?
その手順通りにマクロなり関数なりを記述すれば良いのです。

11月は30日まで…をどうやって調べたらいいのか分からない。
ということであれば「12月1日の1日前が11月の末日」であることを利用すれば良い。
11月の翌月の1日から1日前の日付を求めれば良いってこと。
これは、うるう年でも正確に日数を求めてくれるので便利です。
 =DAY(”2018/12/1”-1)
 =TEXT(”2018/12/1”-1,"dd")
とでもしてみてください。
”2018/12/1”の1日前の日付けを...続きを読む

Qエクセル 数字のみを2倍他

ご覧頂きありがとうございます。
エクセルに記載された記号と数字が混ざったものを、数字だけ切り取り二倍にしたいです。
例)
*0145→*0290
*2000→*4000
の様にアスタリスクをそのままで数字のみを倍にしたいと考えております。


あと倍にした時に10000を超えてしまう場合、1万の位の数を隣のマスに表記したいです。
例)
A1 B1
*5400→*0800 *0001
上記のようにB1に一万の位の数を表記したいです。

二倍にしたい数がバラバラで1000個ほどありかなり困っております。
エクセル内でできるのであればそれが望ましいのですが、困難であれば
VB.netであれば少し扱えるのでプログラムでも可能です。

是非皆さんのお力添えを頂けると幸いです。
宜しくお願い致します。

Aベストアンサー

4桁固定の文字列から取り出し、
“*”+4桁固定表記を前提としました。

関数を分解した形で回答します。
①数字部分4桁を取り出し
=RIGHT(A1,4)

②2倍し、
=B1*2

③2倍した数字を『0』4桁を、
 付加して、*+下4桁のみ表記
="*"&RIGHT("0000"&C1,4)

④4桁固定を前提に、1万以上は
 0001を表記
=IF(C1>=10000,"*"&"0001","")

としました。

データのバリエーションが
問題ですが…
どうなんでしょう?

Qexcel vba 複雑な奴です

【シート1】
<No.>   <日付>   <名前>
 1 2018年01月01日 佐藤
 2   ......... ......
 3
 4

以下連番で続きます。
また、別シートに

【シート2】
<No.>   <日付>   <名前>
 1 2018年06月01日 田中
12
214
423

など番号とびとびで入力されます。

【シート2】の<No.>と同じ番号の行にそれぞれ<日付><名前>
を一発でコピーするマクロを作りたいのですが、調べてもわかりません。

詳しい方教えてください。。。

(例)
シート2 <No.>1 の日付と名前をコピー
シート1 <No.>1 の行を探し、日付と名前のセルに張り付ける

シート2 <No.>12 の日付と名前をコピー
シート1 <No.>12 の行を探し、日付と名前のセルに張り付ける

Aベストアンサー

こんばんは!

Sheet2の1行目は項目行でデータは2行目以降にあるとします。
尚、両シートとも「No.」はA列、「日付」はB列、「名前」はC列とします。

標準モジュールにしてください。

Sub Sample1()
 Dim i As Long
 Dim c As Range, wS As Worksheet
  Set wS = Worksheets("Sheet1")
   With Worksheets("Sheet2")
    For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
     Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
      If Not c Is Nothing Then
       .Cells(i, "B").Resize(, 2).Value = c.Offset(, 1).Resize(, 2).Value
      End If
    Next i
   End With
End Sub

※ コピー&ペーストだと時間を要するだけなので
値の代入としています。
すなわち日付列がお望みの表示形式にならないかもしれませんので
列全体を好みの表示形式にしておいてください。m(_ _)m

こんばんは!

Sheet2の1行目は項目行でデータは2行目以降にあるとします。
尚、両シートとも「No.」はA列、「日付」はB列、「名前」はC列とします。

標準モジュールにしてください。

Sub Sample1()
 Dim i As Long
 Dim c As Range, wS As Worksheet
  Set wS = Worksheets("Sheet1")
   With Worksheets("Sheet2")
    For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
     Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
      If Not ...続きを読む

Qエクセル日付のみ抽出

エクセルの文章の途中の日付 ○/○ だけを抽出したいです。
左でも右でもなく文章の途中です。

お分かりの方いらっしゃいますか??

Aベストアンサー

こんばんは。

=MID(C2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},C2&1234567890)),LEN(C2)*10+1-SUM(LEN(SUBSTITUTE(C2,{0,1,2,3,4,5,6,7,8,9},))))

このように、LEN(C2)*10+1 ←と1を足せば、8/31 の場合、8/3 しか出ないのは直るのですが、

8/ までしか出ない場合は、特例で、空白が紛れ込んでいるので、例えば、原文をマウス選択して、「検索/置換」で、検索値に、半角スペースを置き、置換側は何もいれないようにして、実行すれば、半角のスペースを取り去れば、8/ までしか出ない場合も、出るようになります。


人気Q&Aランキング