こんにちは、
先日、「作りながら覚える! excel vba マクロ 組み方講座 永井善王著」という本を購入してvbaマクロを勉強中です。
本にそって進めていくと、P.122の所でストップしてしまいました。
急に「実行時エラー13 型が一致しません」と表示され、何回やりなおしてもそこから進めなくなりました。

コードは、

Sub DBシートから当月分シートを作成する()

Dim 開始年月日 As Long
Dim 終了年月日 As Long
開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
終了年月日 = "<=" & Worksheets("年月日入力").Range("D5")
ChDir "C:\ときめき"
Workbooks.Open Filename:="C:\ときめき\売上DB.xls"
Sheets("当月分").Select
Cells.Select
Selection.Clear
Sheets("DB").Select
Range("A2").Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:=開始年月日, _
Operator:=xlAnd, Criteria2:=終了年月日
Selection.CurrentRegion.Select
Selection.Copy
Sheets("当月分").Select
Range("A1").Select
ActiveSheet.Paste
Sheets("DB").Select
Application.CutCopyMode = False
Selection.AutoFilter
Sheets("住所録").Select
ActiveWorkbook.Save
ActiveWindow.Close
End Sub

になります。

3行目の 
開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
が黄色くなっています。
(なぜかこの本では、Dim   As Long での変数定義がされておらず、そこは自分で入れています。)

現在本に沿って勉強しているところですが、詰まってしまいお手上げの状態です。
どうぞ助けてくださいませ。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")



セルD4には日付が入っているとして

これでなぜエラーが出るかというと、

右辺
">=" & Worksheets("年月日入力").Range("D4")
これではセルD4は日付(数値)ですが、先頭の">="が文字列ですから
例えば、
  ">=2009/5/28"
のように●文字列●が作成される

一方代入される左辺の変数(開始年月日)は、Long型の数値

で、数値型に文字列は代入できないのでエラーが出るわけです。


よって、string型にするか
Dim 開始年月日 As String
Dim 終了年月日 As String

Variant型にしなけばいけません
Dim 開始年月日 As Variant
Dim 終了年月日 As Variant

Variant型の場合は、As Variantを省いてもOK
 
 
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
また、Variantでも省略でもいけました。
ありがとうございました。
大変わかりやすい説明ありがとうございました。
勉強中の私は、本書に沿って四苦八苦しておりますががんばりたいと思います。
ありがとうございました

お礼日時:2009/05/28 17:55

こんにちは。



>(なぜかこの本では、Dim   As Long での変数定義がされておらず、そこは自分で入れています。)

あるレベルまでは、変数の定義をきっちり決めるようなことをすると、さっぱり分からなくなります。(正しくは、Dim   As String)
データ型は、避けていると一向に上達はしませんが、コツがありますから、あるレベルまでは、データ型を入れるということは絶対的ではありません。

質問のコードとしては、ちょっと、この先に進めていくのは厳しいですね。理由は、その手のワークシートのコーディングは、「記録マクロ」で作ったほうがよいのです。

私は、かねがね思っているのはワークシートの操作は、意外に難しいのです。Range オブジェクト・Cells プロパティ、Sheets オブジェクト・Worksheets オブジェクト、Windows オブジェクト・Workbooks オブジェクト と、同じようなものがいくつも出てきます。それをどう扱ってよいのか分かりにくいので、本来は、その中のひとつを、それぞれ選んでコードを書かないと、いつまでも、あやふやなコードになってしまいます。

ご質問のようなコードは、もしも、教本にあるのなら、もう少し先から進めたほうがよいです。それをやっていると、いつまでも、堂々巡りになってしまいます。

もちろん、

# 開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
# 終了年月日 = "<=" & Worksheets("年月日入力").Range("D5")


開始年月日, 終了年月日 の変数のデータ型は、String 型ではあるのですが、以下の部分が、コアになりますから、その部分が分かっていないと全体がボケてしまいます。

Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:=開始年月日, _
Operator:=xlAnd, Criteria2:=終了年月日

「開始年月日」は、文字列です。

それと、この辺りは、微妙にバージョンに影響する部分ですから、私が教える立場なら、できるなら避けたいのです。

 Worksheets("年月日入力").Range("D4")

これは、暗黙のプロパティですから、見かけ上は、日付型で出てきますが、実際は数値と同じです。String 型としては、数値だけになってしまいます。だから、Excel2000では、マクロでやると、何度やってもうまくいきません。

Selection.AutoFilter Field:=1, Criteria1:=">=5月24日"
このようには代入されません。=">=39957" となってしまいます。
これでも、フィルターされるはずです。

煮ても焼いても食えないものとして、オートフィルターや入力規則、条件書式、Webクエリ、統合などが挙げられます。ベテランの人でも、入門者でも、ここらは、ほとんど技術的に違いが現れません。

テキストの P.122 というと、本の中ごろでしょうか?VBAの「コンテナ」や「With 」の使い方というのは出ていませんか?まず、そこら辺りのテクニックを学んでから実践に移られてもよいと思います。VBAの上達の近道は、できる限りワークシートを扱わないことです。今回のような長いコードを使わずに、一行マクロ(Sub, End Sub で三行)から、進めたほうが早いようです。そうしたほうが、学習が進みます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
本書でvba勉強をを合間をみて行っているだけで、まだまだvbaの基礎も何もわかっていないのが現状です。
今本書を用いて行っている勉強も本書にそって、なぞっているだけで確かに身になっているかといったら、?マークがつきます。
バージョンによって使用できるできないというのも正直初耳でした。
テキストのp.122は中頃ですが、コンテナ、with といったものはまだ出てきていません。
おしゃっる通り、これからどのように勉強していくか、考え直さないといけないかもしれませんが、1度はじめたものから逃げ出すのも嫌な性格なもので、とりあえず本書に沿って1つの販売管理をつくりその後、もう一度良い参考書を探し勉強していきたいと思います。
これからも、詰まってしまう所があると思いますので、お時間ありましたらまた助けて下さいませ。
ありがとうございました。

お礼日時:2009/05/28 18:12

エクセルの、クライテリアに当たるものは、文字列で表現するものが多い。

その文字列を、エクセルは、プログラムコードの一部にそのまま置き変える(はめ込む間に)のだと想像します。
関数でも例えばCOUNTIFの第2引数でも、>70でなく、">70"と文字列の例があります。
そういう例で
Dim 開始年月日 As Long
は正しくは Stringです。&で演算子文字列と結合してるじゃないですか。
>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
としています。
&は文字列結合に使うものです。
これを勝手に入れたのが原因かも知れません。
永井先生の本にしては、マクロの記録みたいで、スマートじゃないが、ほんとにこの通り、本位載ってましたか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
ありがとうございました。
本書には、確かに
>開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")
との記載がありました。
勉強中の私は、本書に沿って四苦八苦しております。
ありがとうございました

お礼日時:2009/05/28 17:53

「開始年月日」と「終了年月日」はオートフィルタの抽出条件に使って居ますからLongではなくStringにしないと駄目ですね。



Dim 開始年月日 As Long
Dim 終了年月日 As Long

をLong→String で試して見てください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
ありがとうございました

お礼日時:2009/05/28 17:58

変数定義をご自分でされたようですが、


「Sub DBシートから当月分シートを作成する()」の外に既に定義されていませんでしたか?
他の部分でも「開始年月日」「終了年月日」が必要になる場合、
Dimではなく、PrivateやPublicなどの広範囲で定義する場合があります。
確認してみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました、 String で解決いたしました。
大変わかりやすい説明ありがとうございました。
勉強中の私は、本書に沿って四苦八苦しておりますががんばりたいと思います。
ありがとうございました

お礼日時:2009/05/28 17:57

VBAは変数を定義しないでも動きますからね。


私もこの程度の長さのVBAコードなら、変数定義なんぞしません。
ちゃんとユーザに納品するモノならoption宣言して定義しますが。

・・・それはともかく。

開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")

これ、右側が変換しきれないデータなんじゃないですか? ステップ
実行で「?Worksheets("年月日入力").Range("D4")」をイミディエイト
ウインドウでチェックしてみてください。

素直に数字が出てきたら、Cstr(Worksheets("年月日入力").Range("D4"))
と書き換えれば動くはずです。出てこないなら、"年月日入力"という
シートがあるか確認したほうがいいかもです。ひょっとしてSheets("sheet1")
で済む話だったりして・・・。結構「シート名設定ミス」ってあるんですよね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
そうですか、普通はこれぐらいだと変数定義しないものなんですね。自分の勉強不足の所も多々ありました。
解決いたしました。ありがとうございました。

開始年月日 = ">=" & Worksheets("年月日入力").Range("D4")

は、右側も変換できました。
本書の通り年月日というシートを作成いたしました。
わからない所だらけなのでご指摘ありがとうございました。

お礼日時:2009/05/28 17:49

Dim 開始年月日 As Long


Dim 終了年月日 As Long

この両方から As Long を削除したらどうなりますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
削除でいけました。
ただ今回は、勉強もふくめましてAs Stringを使用しました。
解決いたしました。ありがとうございました

お礼日時:2009/05/28 17:43

>なぜかこの本では、Dim   As Long での変数定義がされておらず、そこは自分で入れています。



変数宣言を指導しないのはなぜでしょうね?

ちなみに日付なら As Date としてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
本書では、変数宣言を指導していなかったので過去にも一度つまづきました。自分の勉強不足の所も多々ありますのでなんともいえませんが。
解決いたしました。ありがとうございました。

お礼日時:2009/05/28 17:42

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

Qmultiple definitionというエラー

現在Ubuntu LinuxのgccでC言語のプログラムをやっています。

https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2452/trunk/20140411/code.h

このツリーのcode.hに ”const sig_code2_t PVC_TCP_SIG_CODE[100] = {” というコードを追加してmakeを行うと次のようなエラーが出て実行ファイルが出力されません。



(エラー内容)

---------------(中略)-----------------
gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o mount.o net.o misc.o -lpthread
event.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
env.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
audio.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
task.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
comm.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
mount.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
net.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
misc.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE'
main.o:(.rodata+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [exe] Error 1






この const sig_code2_t PVC_TCP_SIG_CODE[100] = {をコメントアウト正常にビルドできるのですが、




この問題を解決するにはどうすれば良いのかご教示頂きますようお願い致します。

現在Ubuntu LinuxのgccでC言語のプログラムをやっています。

https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2452/trunk/20140411/code.h

このツリーのcode.hに ”const sig_code2_t PVC_TCP_SIG_CODE[100] = {” というコードを追加してmakeを行うと次のようなエラーが出て実行ファイルが出力されません。



(エラー内容)

---------------(中略)-----------------
gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o mount.o net.o misc.o -lpthread
event.o:(.rodat...続きを読む

Aベストアンサー

お約束の「ヘッダに実体を定義してはいけない」ってヤツです。

code.hに記述した内容はall_includes.hに適用されます。
all_includes.h内で#include "code.h"していますからね。

で、all_includes.hの内容はそれぞれ
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
つまり、code.hに記述した内容も
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
それぞれのオブジェクトファイルにPVC_TCP_SIG_CODE[100]が存在します。

リンクする段階でどのオブジェクトファイルのPVC_TCP_SIG_CODE[100]を使用したらいいのでしょうか?????
というエラーです。

extern宣言して、実体をどこかのソースファイルのみに記述する。
というのが一般的な対処方法です。
# static宣言にすればとりあえずリンクは通るかもしれませんが…無駄が出ますねぇ。
# 今回はconstなので、メモリに無駄が出るだけ…で済むかと思われますが。
http://d.hatena.ne.jp/saitodevel01/20110321/1300685958

お約束の「ヘッダに実体を定義してはいけない」ってヤツです。

code.hに記述した内容はall_includes.hに適用されます。
all_includes.h内で#include "code.h"していますからね。

で、all_includes.hの内容はそれぞれ
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
つまり、code.hに記述した内容も
audio.c、comm.c、env.c、event.c、main.c、misc.c、mount.c、net.c、task.cに適用されます。
それぞれのオブジェクトファイルにPVC_TCP_SIG_CODE[100]が存在します。...続きを読む

QExcel でシート間の重複データ(Sheet1のA=Sheet2のA かつ Sheet1のB=Sheet2のB)

Excel2000です。

Sheet1のA列・B列・C列・・・にデータが入っています。
Sheet2のA列・B列・C列・・・にデータが入っています。

Sheet1のA列とSheet2のA列は、似たようなデータが入っています。
Sheet1のB列とSheet2のB列も、同様です。
C列以降のデータは、シート間で全然関係ありません。

Sheet1の行データ(A列・B列)が、Sheet2(A列・B列)にも存在しているかどうか、
を知るには、どうすればよいですか。
C列以降の列のデータは、比較する際に使いません。

つまり、
Sheet1のA = Sheet2のA
かつ
Sheet1のB = Sheet2のB
であるような行を知りたいのですが、

どうすればよいのでしょうか。

Aベストアンサー

Sheet1、Sheet2 ともに空いている列に =A1&B1 のような連結データを作り、Matchなどで比較するとか、、、

Sheet1 の E1 =A1&B1
Sheet2 の E1 =A1&B1
Sheet1 の F1 =MATCH(E1,Sheet2!E:E,0)

Qbear the definitions

bear the definitions
という場合、このbearはどういう訳となるのでしょうか?


Bold and capitalized terms not defined herein bear the definitions in the Competition Packet.
という文で使われていました。

「ここで定義していない太字と大文字表記は、Competition Packetに定義されている」という意味でしょうか?

Aベストアンサー

yes

Q=IF(Sheet1!MX9="", "",Sheet1!MX9) で表した結果に条件付き書式を

こんにちは、エクセル2010を使っています。

A1セル
=IF(Sheet1!MX9="", "",Sheet1!MX9) B1セル =IF(Sheet1!MY9="", "",Sheet1!MY9)
と数式が入っていて、結果が 29% 36% などとなって居ます。

このセルに、【30%以上の場合は】と条件を与えても動作するどころか空白まで全てに条件が適用されてしまいます。

これを通常通り条件付き書式を与えるにはどうしたら良いでしょうか。

詳しい方、よろしくお願いいたします。

Aベストアンサー

少し面倒ですが、現状のA1、B1の計算式を変えない方法として
条件付き書式をいじってみては?

A1を選択して 条件付き書式 → 新しいルール → 数式を使用して、書式設定するセルを決定 を選択
下部に表示されたテキストボックスに、
=VALUE(A1)>=0.3 (0.3は30%の意)
と入力、設定したい書式を選択して設定する

あとは、A1のセルをコピー、B1に書式のみ貼り付けでOK

Qウィンドウズのアップデートで10月20日に、Definition Up

ウィンドウズのアップデートで10月20日に、Definition Update for wWindows Defender-KB015597(Definition 1.93.26.0)が2回インストールされましたが、そのあとにもう一つ「更新プログラムをインストールしています(50パーセント完了)」とありますが、今日で3日連続表示され、インストールが進みません。なにか解決方法はないでしょうか?PCは初心者クラスです。よろしくお願いします。

Aベストアンサー

>今日で3日連続表示され、インストールが進みません。
ちょっと状況がつかめません。
毎日の起動時に同じ内容が表示されることが3回続いた、ということでしょうか。それとも、72時間の間ずっと「(50パーセント完了)」の状態なのでしょうか。

前者なら
http://menushowdelay.blog13.fc2.com/blog-entry-523.html
とその中のリンクを。
後者なら、とりあえず再起動しましょう。

Q[Excel VBA] selectionとselectはどのように違うのですか?

selectionオブジェクトは、selectされたオブジェクトを表すときに
使用するのですか?

使用するときの違いがわかりません。
よろしくお願いいたします。

Aベストアンサー

こんばんは。Wendy02です。

返事が遅くなってすみません。ちょっと、面倒なことをしていたので……。

>selectionは、セル範囲の取得だけにしか使用できず、他の
>オブジェクトは使えないですね?

いいえ、マウスで選択するもので、ワークシートの中のものなら、ほとんどです。
一つだけできないのは、コントロールツールのオブジェクトですね。

ためしに、

MsgBox TypeName(Selection)

として、マクロを動かしてみてください。

Range やら、ChartArea とか、いろいろ出てくるはずです。つまり、それが取得したオブジェクトですから、その後は、いろいろ加工することが出来ます。ただし、ChartArea などは、ちょっと面倒だから、そのまま、ActiveChart と切り替えたほうが楽です。

QOn Error GoTo でエラーが発生する

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

   Do
   On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
   On Error GoTo 0
   Loop

ErrorTrap2:

End Sub

しかし、以下のようにSubで二つに分けるとエラーは出ません。

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

Call Macro2

End Sub
Sub Macro2()

    Do
     On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
    On Error GoTo 0
    Loop

  ErrorTrap2:

End Sub

「On Error GoTo 0」がうまく解除できていないのかと思い、いろいろ試してみました。
しかし、どういった理由かはわかりませんでした。
「On Error GoTo」は、Subでは、ひとつしか使えないのでしょうか。

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

   Do
   On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
   On Error GoTo 0
   Loop

ErrorTrap2:

End Sub

しかし、以下のようにSubで二つに分けるとエラーは出ません。

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

Call Macro2

End Sub
Sub Macro2()

    Do
     On Error G...続きを読む

Aベストアンサー

エラー処理の中でOn Error GoToを記述することはできません。


エラー処理の基本的な構造は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Exit Sub

ErrorTrap1:
  'エラー処理
  Resume Next

End Sub


エラー処理が2つある場合は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Do
  On Error GoTo ErrorTrap2
    '-エラーの発生するコード 2
  On Error GoTo 0
Loop

Exit Sub

ErrorTrap1:
  'エラー処理1
  Resume Next

ErrorTrap2:
  'エラー処理2
  Resume Next

End Sub


Resume Next でエラーが発生した行の次の行から再開します。
Resumeには他の構文もありますので、調べてみてください。

エラー処理の中でOn Error GoToを記述することはできません。


エラー処理の基本的な構造は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Exit Sub

ErrorTrap1:
  'エラー処理
  Resume Next

End Sub


エラー処理が2つある場合は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Do
  On Error GoTo ErrorTrap2
    '-エラーの発生するコード 2
  On Error GoTo 0
Loop

Exit Sub

...続きを読む

Q開始と終了の年月日入力と同時に、該当月のセルに色を表示したいです。

A列2行目に工事開始年月(年月日の場合もあります)を入力、
B列2行目に工事終了年月(年月日の場合もあります)を入力します。
C列1行目から右隣の列へとこの先の年月だけが入力されております。
工事開始年月(A列2行目)と工事終了年月(B列2行目)を入力した時に、C列以降の列の2行目にはその期間に該当するだけ、セルが自動的に青く塗りつぶされるようにしたいのですが、この場合、C列2行目以降の列にはどんな数式を入力すれば良いでしょうか?
条件付き書式で色の表示は設定すれば良いのかなと思うのですが、
肝心な数式がわかりません。もしくは他に良い方法があるのかもしれません。
どなたかご存知でしたら教えていただけないでしょうか?
よろしくお願いいたします。

イメージ
1行目  開始日  完了日    08/03 08/04 08/05 08/06
2行目 08/03/01 08/05/30     青   青   青

Aベストアンサー

・開始日と完了日は「年月」の場合と「年月日」の場合がある
・タイトル行は「年月」のみ
この条件だと、日付シリアル値での比較は難しいと思います。

いっそのこと、元の表を改変した方がいいかと。
もし表の改変が不可であれば、この回答はスルーして下さい。

開始日と完了日を、それぞれ年、月、日に分けます。
A列が開始年、B列が開始月、C列が開始日
D列が完了年、E列が完了月、F列が完了日
タイトル行の年月も縦に年、月と分けます。
つまり1行目と2行目をタイトル行とし、データ行は3行目以降、
色をつける部分はG列以降とします。
ここでG3を選択して「条件付書式」で「数式が」
「=AND($A3*100+$B3<=G$1*100+G$2,$D3*100+$E3>=G$1*100+G$2)」
の場合「パターンを青」と設定します。
後はこのG3のセルを色をつけたい範囲全てにコピー&ペーストします。

Qステレオミキサーの「realtek high definition a

ステレオミキサーの「realtek high definition audio 6.0.1.5490」より新しいバージョンのものはありますか?更新したいので。

Aベストアンサー

こんばんは。

現状ですと、[R2.47]の"6.0.1.6083"が最新のようです。
RealtekのOHPからダウンロードできます。
http://www.realtek.com.tw/downloads/downloadsCheck.aspx?Langid=4&PNid=24&PFid=24&Level=4&Conn=3&DownTypeID=3&GetDown=false

QExcel2013 VBA sheet1とsheet2のデータを合成してsheet3を作るには

sheet1に氏名、sheet2にその氏名の人の趣味が入っています。

新たにsheet3を作成して、
氏名1
趣味
氏名1

氏名2
趣味
氏名2

氏名3
趣味
氏名3

氏名4
趣味
氏名4

としたいです。
VBAのコードを教えて下さい。

例えば
①sheet1には
A1;1 B1;阿部 C1;あべ
A2;2 B2;佐藤 C2;さとう
A3;3 B3;山名 C3;やまな
A4;4 B4;山本 C4;やまもと

②sheet2にはその人の趣味が入っています。

A1;1  B1;釣り C1;つり
A2;空白 B2;踊り C2;おどり
A3;空白 B3;歌 C3;うた

A4;2  B4;読書 C4;どくしょ
A5;空白 B5;野球 C5;やきゅう


A6;3 B6;映画鑑賞 C6;えいがかんしょう

A7;4  B7;釣り C7;つり
A8;空白 B8;踊り C8;おどり
A9;空白 B9;歌 C9;うた

③sheet3を新に作成して

A1;1 B1;阿部 C1;あべ
A2;空白  B2;釣り C2;つり
A3;空白 B3;踊り C3;おどり
A4;空白 B4;歌 C4;うた
A5;空白 B5;阿部 C5;あべ

A6;2 B6;佐藤 C6;さとう
A7;空白 B7;読書 C7;どくしょ
A8;空白 B8;野球 C8;やきゅう
A9;空白 B9;佐藤 C9;さとう

A10;3 B10;山名 C10;やまな
A11;空白 B11;映画鑑賞 C11;えいがかんしょう
A12;空白 B12;山名 C12;やまな

A13;4 B13;山本 C13;やまもと
A14;空白  B14;釣り C14;つり
A15;空白 B15;踊り C15;おどり
A16;空白 B16;歌 C16;うた
A17;空白 B17;山本 C17;やまもと



のようにしたいです。

実際、データは、sheet1は419列、sheet2は2563列あります。

sheet1に氏名、sheet2にその氏名の人の趣味が入っています。

新たにsheet3を作成して、
氏名1
趣味
氏名1

氏名2
趣味
氏名2

氏名3
趣味
氏名3

氏名4
趣味
氏名4

としたいです。
VBAのコードを教えて下さい。

例えば
①sheet1には
A1;1 B1;阿部 C1;あべ
A2;2 B2;佐藤 C2;さとう
A3;3 B3;山名 C3;やまな
A4;4 B4;山本 C4;やまもと

②sheet2にはその人の趣味が入っています。

A1;1  B1;釣り C1;つり
A2;空白 B2;踊り C2;おどり
A3;空白 B3;歌 ...続きを読む

Aベストアンサー

こんばんは!

Sheet3にSheet1のデータを二度表示させるのがイマイチ理解できませんが、
ご質問通りにやってみました。

Sub Sample1()
Dim i As Long, lastRow As Long, myCnt As Long
Dim c As Range, wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
Application.ScreenUpdating = False
wS2.Rows(1).Insert
wS2.Range("D:D").Insert
With Worksheets("Sheet3")
.Cells.ClearContents
lastRow = wS2.Cells(Rows.Count, "B").End(xlUp).Row
Range(wS2.Cells(2, "D"), wS2.Cells(lastRow, "D")).Formula = "=IF(A2="""",D1,A2)"
For i = 1 To wS1.Cells(Rows.Count, "A").End(xlUp).Row
With .Cells(Rows.Count, "B").End(xlUp).Offset(1)
.Value = wS1.Cells(i, "B")
.Offset(, -1) = wS1.Cells(i, "A")
.Offset(, 1) = wS1.Cells(i, "C")
End With
Set c = wS2.Range("A:A").Find(what:=wS1.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
myCnt = WorksheetFunction.CountIf(wS2.Range("D:D"), wS1.Cells(i, "A"))
.Cells(Rows.Count, "B").End(xlUp).Offset(1).Resize(myCnt, 2).Value = _
c.Offset(, 1).Resize(myCnt, 2).Value
End If
'▼
.Cells(Rows.Count, "B").End(xlUp).Offset(1).Resize(, 2).Value = _
wS1.Cells(i, "B").Resize(, 2).Value
'▲
Next i
.Rows(1).Delete
wS2.Rows(1).Delete
wS2.Range("D:D").Delete
Application.ScreenUpdating = True
.Activate
End With
MsgBox "完了"
End Sub

※ コード内の▼から▲までがもう一度Sheet1のデータを表示させているコードです。
細かい検証はしていませんが、
こんな感じではどうでしょうか?m(_ _)m

こんばんは!

Sheet3にSheet1のデータを二度表示させるのがイマイチ理解できませんが、
ご質問通りにやってみました。

Sub Sample1()
Dim i As Long, lastRow As Long, myCnt As Long
Dim c As Range, wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
Application.ScreenUpdating = False
wS2.Rows(1).Insert
wS2.Range("D:D").Insert
With Worksheets("Sheet3")
.Cells.ClearContents
lastRow = ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報