Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


342 / 3841 ページ ←次へ | 前へ→

【75581】Re:【VBA】該当欄にコピー
お礼  みつ  - 14/5/21(水) 17:41 -

引用なし
パスワード
   ありがとうございました。
説明もわかりやすく、また一つ勉強になりました。

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


▼kanabun さん:
>▼みつ さん:
>
>>E5に5/2といれ
>>H5の『品名』に文字(例えばリンゴ)を入れると
>>開始日の5/2に当てはまるセル(J5)にリンゴと入るようにしたいのですが‥
>>
>ワークシートのChangeイベントを利用してみては?
>以下のコードを該当ワークシートのシートモジュールにコピーし、
>E列に「開始日」をいれ、H列に「品名」を入れると、
>下のコードが実行されます。
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>  If Target.Column <> 8 Then Exit Sub
>  Dim ss As String
>  Dim dt As Variant
>  Dim dt1 As Date, diff As Long
>  ss = Target.Value
>  If Len(ss) < 1 Then Exit Sub
>  dt = Target.Offset(, -3).Value
>  If IsEmpty(dt) Then Exit Sub
>  
>  dt1 = [I2].Value
>  diff = dt - dt1 + 1
>  Application.EnableEvents = 0
>  Target.Offset(, diff).Value = ss
>  Application.EnableEvents = 1
>End Sub
>
>上のコードで
>最初の行に
>>  If Target.Column <> 8 Then Exit Sub
>と書いてあります。
>Target は変化のあったセルのことです。
>上の一行は、
>セルに入力があったもののうち 列がH列でなければ終了せよ、
>と言っています。逆にいえば、H列への入力のときだけ、
>それ以降のコードが実行されるということです。
>[I2]セルの日付をみて、それとTarget行のE列の日付の差分だけ列を右に移動
>したセルに、Targetセルの値をコピーします。
・ツリー全体表示

【75580】Re:advancedfilterでの日付け検索
お礼  masu  - 14/5/21(水) 17:37 -

引用なし
パスワード
   ▼kanabun さん:
有難うございました
理解出来ました
文字位置 更に文字数を調べて
MID関数を使用
その結果思うような結果がえられました
また、疑問点が出ましたら
よろしくお願いします
・ツリー全体表示

【75579】Re:【VBA】該当欄にコピー
発言  kanabun  - 14/5/21(水) 17:29 -

引用なし
パスワード
   ▼みつ さん:

>E5に5/2といれ
>H5の『品名』に文字(例えばリンゴ)を入れると
>開始日の5/2に当てはまるセル(J5)にリンゴと入るようにしたいのですが‥
>
ワークシートのChangeイベントを利用してみては?
以下のコードを該当ワークシートのシートモジュールにコピーし、
E列に「開始日」をいれ、H列に「品名」を入れると、
下のコードが実行されます。

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column <> 8 Then Exit Sub
  Dim ss As String
  Dim dt As Variant
  Dim dt1 As Date, diff As Long
  ss = Target.Value
  If Len(ss) < 1 Then Exit Sub
  dt = Target.Offset(, -3).Value
  If IsEmpty(dt) Then Exit Sub
  
  dt1 = [I2].Value
  diff = dt - dt1 + 1
  Application.EnableEvents = 0
  Target.Offset(, diff).Value = ss
  Application.EnableEvents = 1
End Sub

上のコードで
最初の行に
>  If Target.Column <> 8 Then Exit Sub
と書いてあります。
Target は変化のあったセルのことです。
上の一行は、
セルに入力があったもののうち 列がH列でなければ終了せよ、
と言っています。逆にいえば、H列への入力のときだけ、
それ以降のコードが実行されるということです。
[I2]セルの日付をみて、それとTarget行のE列の日付の差分だけ列を右に移動
したセルに、Targetセルの値をコピーします。
・ツリー全体表示

【75578】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/21(水) 16:57 -

引用なし
パスワード
   ▼masu さん:

> 6行目 2012/8/5AM
> 7行目 2015/12/5AM  があるとします

>例えば
> 8月のみを検索するときの条件式は
>  検索条件式
>  E1             
>  E2 =MONTH(Sheet1!D2)=8   
>  E3 =MID(Sheet1!D2,n,1)="8"

>この時の n は 1 を入れておけばよろしいのでしょうか

たとえば
> 6行目 2012/8/5AM
とあったら、"8" は 文字列"2012/8/5AM"の左から何文字目の1文字ですか
6文字目ですよね?
なので、
  E3 =MID(Sheet1!D2,6,1)="8"
です。


>また、月及び日の値が 12 等の2桁の場合は
> =MID(Sheet1!D2,n,2)="12" なのでしょうか

それも同じことで、
> 7行目 2015/12/5AM
       ↑↑ 
の6文字目から2文字分を抽出して "12"と比較するわけですから、
  E3 =MID(Sheet1!D2,6,2)="12"
です。
・ツリー全体表示

【75577】Re:advancedfilterでの日付け検索
質問  masu  - 14/5/21(水) 16:10 -

引用なし
パスワード
   ▼kanabun さん:
質問が上手く書けていないようでしたので
 再度書かせていただきました

  検索sheet1 のD列に
      D
 2行目 2002/10/5
 3行目 2010/11/15
 4行目 2014/1/25
 5行目 2012/8/5
 6行目 2012/8/5AM
 7行目 2015/12/5AM  があるとします
  ・
  ・

これをAdvancedFilterで検索をしています
この中から条件式にあったものを抽出する
例えば
 8月のみを検索するときの条件式は
  検索条件式
  E1             
  E2 =MONTH(Sheet1!D2)=8   
  E3 =MID(Sheet1!D2,n,1)="8"

5日のみを検索するときの条件式は
  検索条件式
  E1   
  E2 =DAY(Sheet1!D2)=5
  E3 =MID(Sheet1!D2,n,1)="5"

この時の n は 1 を入れておけばよろしいのでしょうか
また、月及び日の値が 12 等の2桁の場合は
=MID(Sheet1!D2,n,2)="12" なのでしょうか

よろしくお願いします
・ツリー全体表示

【75576】Re:advancedfilterでの日付け検索
発言  kanabun  - 14/5/21(水) 14:27 -

引用なし
パスワード
   ▼masu さん:
>advancedfilterでの日付け検索を行いましたが
>年の場合は上手く検索できるのですが
>月;日の検索が上手くいきません
>
>  検索sheetに
> 5行目 2012/8/5
> 6行目 2012/8/5AM  があるとします
>
>  E1
>  E2 =MONTH(Sheet1!D7)=8
>  E3 =LEFT(Sheet1!D7,2)="8"
>
>  E1
>  E2 =DAY(Sheet1!D7)=5
>  E3 =LEFT(Sheet1!D7,2)="5"
>
>で検索しますと 5行目 2012/8/5 の値は検索されますが
>6行目 2012/8/5AM  の値は検索されません

いくつか判らないことがあります。

Q1. まず、
データが 「5行目」「6行目」にあるのに、
>  E2 =MONTH(Sheet1!D7)=8
>  E3 =LEFT(Sheet1!D7,2)="8"
検索条件式がD7 と7行目になっているのはなぜですか?

Q2. つぎに、
> 6行目 2012/8/5AM
この値は「日付」ではなく「文字列」です。
2つ目の検索条件式が
>  E3 =LEFT(Sheet1!D7,2)="8"
となっているのは、文字列の"8"を見つけようとしているからですか?

Q3. Q2.の通りだとすると、
> =LEFT(Sheet1!D7,2)="8"
はおかしい。これは D7セルの文字列の「左から2文字が"8"である」という
式ですから、"8"は2文字でないのでどんなデータとも永久に合いません。
「左から n 番目の1文字が "8"なら」とするには

 =MID(Sheet1!D7,n,1)="8"

とする必要があります。(nには適当な数値を入れる)
・ツリー全体表示

【75575】【VBA】該当欄にコピー
質問  みつ  - 14/5/21(水) 13:26 -

引用なし
パスワード
   VBAで質問です。

E5に『開始日』・・・5/2
H5に『品名』
I5以降は5月のカレンダー・・・5/1(I5) 5/2(J5) 5/3(K5)...5/31(AM5)
※日付はI2に入っているので、I5以降は実際は空白です。
という表があります。

E5に5/2といれ
H5の『品名』に文字(例えばリンゴ)を入れると
開始日の5/2に当てはまるセル(J5)にリンゴと入るようにしたいのですが‥


関数で=IF($E5=I$2,$H5,"")のように入力することはわかったのですが
これをVBAでしたいのです。

該当セルに関数をいれてしまうと、セル幅が狭いため、すべての文字が表示されなくなるためです。

H5の品名に文字を入れると開始日の5/2に当てはまるセル(J5)にリンゴとインプットされる感じです。
(I5:AM137まで同じように表示したいです)

どうぞ、ご教示くださいませ。
お願い致します。
・ツリー全体表示

【75574】advancedfilterでの日付け検索
質問  masu  - 14/5/21(水) 13:17 -

引用なし
パスワード
   advancedfilterでの日付け検索を行いましたが
年の場合は上手く検索できるのですが
月;日の検索が上手くいきません

  検索sheetに
 5行目 2012/8/5
 6行目 2012/8/5AM  があるとします

  E1
  E2 =MONTH(Sheet1!D7)=8
  E3 =LEFT(Sheet1!D7,2)="8"

  E1
  E2 =DAY(Sheet1!D7)=5
  E3 =LEFT(Sheet1!D7,2)="5"

で検索しますと 5行目 2012/8/5 の値は検索されますが
6行目 2012/8/5AM  の値は検索されません
月;日も同じ結果です
LEFT関数の処理がおかしいとおもうのですが
処理の仕方が分からず困っています
よろしくお願いします
・ツリー全体表示

【75573】Re:ループ→転記→ループ→転記
発言  γ  - 14/5/18(日) 22:27 -

引用なし
パスワード
   14/5/15(木) 23:09 にもコメントしています。
読み飛ばさないで頂きたい。
・ツリー全体表示

【75572】Re:マクロで、同じ番号行だけを残す方法
発言  γ  - 14/5/18(日) 22:25 -

引用なし
パスワード
   興味深いので、作成してみました。
Yukiさんのは、必要なデータのみコピーする方式ですが、
質問者さんは Sheet2をそのままコピーして、あとから削除する方式。
私もYukiさん方式を採用するだろうが、一応、質問者さん方式で作成しました。

また、質問の最初にあるように結合セルをあえて対象にしています。

■問題の説明(改めて)

<<Sheet1>>
  A  B   C
1 No. 名前  性別
2 A01 梅尾  女
3 A02 福田  男
4 B01 石川  女
5 B02 森田  男

<<Sheet2>>
  A  B   C    D   E
1 
2 タイトル
3 番号 No. 住所 年齢 特徴
4                  
5 1  A01  東京  19歳 国語が得意
20 2  A02  鹿児島 19歳 国語、国語、英語、数学、運動が得意
35 3  A03  米国  19歳 数学が得意
(なお、3〜4行目はセル結合されている。
5〜19,20〜34,35〜49行のA〜D列は、セル結合されています。

------------------------------
やりたいことは、
・Sheet2をコピーした Resultシートを作成し、
・以下のように、
 B列とC列の間に、(No.に対応してSheet1で得られる)名前を挿入することです。

<<Result>>
  A  B   C    D    E   F
1 
2 タイトル
3 番号 No. 名前  住所  年齢 特徴
4                  
5 1  A01  梅尾  東京  19歳 国語が得意
20 2  A02  福田  鹿児島 19歳 国語、国語、英語、数学、運動が得意

(なお、セル結合はSheet2と同じ。1データが15行に渡って結合されている。)

-------------
手順:

1. Sheet2をコピーして Resultシートを作成
2. ResultシートのB列をC列に挿入コピー(それより右の列は右側に移動)
3. Resultシートについて以下の作業を行う。
  (1)B列のデータあり最終行を求める。
  (2)その行から、5行目までについて、15行おきに下から、以下の作業を繰り返す。
  (2)そのセルのNo.がSheet1にあれば、それに対応する「名前」をC列に上書き。
  (3)そのセルのNo.がSheet1になければ、そのセルの行から始まる15行を削除する。

-------------
参考コード(あえてDictionaryを使わない方式)

Sub test2()
  Dim resWS As Worksheet
  Dim k As Long
  Dim lastRow As Long
  Dim s As String
  Dim v
  
  Worksheets("Sheet2").Copy after:=Worksheets("Sheet2")
  Set resWS = ActiveSheet
  resWS.Name = "RESULT"

  With resWS
    .Columns("B").Copy
    .Columns("C").Insert Shift:=xlToRight
    .Range("C3").Value = "名前"
    lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
    
    For k = lastRow To 5 Step -15
      s = .Cells(k, 2).Value
      
      v = Application.VLookup(s, Worksheets("Sheet1").Range("A:C"), _
                  2, False)
      If Not IsError(v) Then
        .Cells(k, 3).Value = v
      Else
        .Cells(k, 1).Resize(15, 1).EntireRow.Delete
      End If
    Next
  End With
End Sub

なお、セル結合は、ソートしたくても簡単にはできないし、
データ部分をセル結合するのは避けた方が得だと思う。

-------------
それから、
> しかし、今回の場合、本を見ても、そのまま使える例が無く、また応用も出来ませんでした。
> どうやれば、このようなコードが書けるようになるのでしょうか?
> もっと例題の多い本やネットのサイト等があるのでしょうか?
についてひとこと。

そのまま写せば済むようなら誰も苦労しません。現実はそれなりに複雑です。
そう難しくもないだろうが、舐めてかかってできるものでもない。
ネットのどこかに答えが書いてあるわけでもありません。
面倒でも、ひとつひとつのケースを深掘りして経験を蓄積していくしかありません。

他人とのやりとりも一字一句を正確に記述する、
そのような、ある意味で辛気くさいことを実行する覚悟がないと、簡単には行きません。
しかし、掛けた労力は必ずきちんと返って来るはずです。
・ツリー全体表示

【75571】Re:マクロで、同じ番号行だけを残す方法
お礼  ザ 焼鳥男  - 14/5/18(日) 20:33 -

引用なし
パスワード
   yuki様

いつもお世話になっております。

有難う御座いました。

教えて頂きましたコードを大切に使わせて頂きます。

VBAは、何でも出来ますが、自分が使うパターンは決まっていますので、

数パターンを、覚えるようにします。

その前に、コマンドの意味を理解して、応用が出来るようにします。

今後とも、よろしくご指導願います。
・ツリー全体表示

【75570】Re:ループ→転記→ループ→転記
お礼  him  - 14/5/18(日) 17:40 -

引用なし
パスワード
   こたつねこ さん
こんにちは。
返信が遅くなり申し訳ありません。
新たなコードありがとうございます。
感謝致します。
・ツリー全体表示

【75569】Re:マクロで、同じ番号行だけを残す方法
発言  Yuki  - 14/5/18(日) 16:55 -

引用なし
パスワード
   ▼ザ 焼鳥男 さん:
前回の応用で出来ます。

Option Explicit

Sub TESTa()
  Dim Dic   As Object
  Dim v    As Variant
  Dim i    As Long
  Dim j    As Long
  Dim sht   As Worksheet
  Dim eRow  As Long
  
' result シートのチェック
  On Error Resume Next
  Set sht = Worksheets("result")
  If Err.Number = 0 Then
    sht.Cells.ClearContents   'シートがあったらクリア
  Else              '無かったら追加
    Set sht = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    sht.Name = "result"     '名前を result
  End If
  On Error GoTo 0
' ******************* 此処まで **************

  With Worksheets("Sheet11")
    v = .Range("A1").CurrentRegion.Value
  End With
' Dictionary に登録
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 2 To UBound(v)
    Dic(v(i, 1)) = i
  Next

  sht.Cells(1, 1).Resize(, 9).Value = Array( _
          "ナンバー", "ネーム", "相対的強さ", "ボゾン質量", _
          "関連力", "方程式", "到達距離", "関係者", "備考")
  eRow = 1
  With Worksheets("Sheet12")
    For i = 2 To .Range("A" & .Rows.Count).End(xlUp).Row
'      Dictionary の登録とあえば
      If Dic.Exists(.Cells(i, 1).Value) Then
'        行番号を追加してコピペ
        eRow = eRow + 1
        .Cells(i, 1).Resize(, 2).Copy sht.Cells(eRow, 1)
        Worksheets("Sheet11").Cells(Dic(.Cells(i, 1).Value), 3).Copy sht.Cells(eRow, 3)
        .Cells(i, 4).Resize(, 6).Copy sht.Cells(eRow, 4)
      End If
    Next
  End With
End Sub
・ツリー全体表示

【75568】Re:マクロで、同じ番号行だけを残す方法
発言  ザ 焼鳥男  - 14/5/18(日) 15:36 -

引用なし
パスワード
   すいません。質問がぐちゃぐちゃになって見づらくなりました。
整理しますと
以下のコードで

Sub macro1()
 Dim LastRow As Long
 LastRow = Worksheets("Sheet2").Range("A65536").End(xlUp).Row

'結果シートを準備
 Worksheets("Sheet2").Copy after:=Worksheets("Sheet2")
 ActiveSheet.Name = "RESULT"

'ファイル1から転記、不要な行を抹消
 Range("C1:C" & LastRow).Formula = "=VLOOKUP(A1,Sheet1!A:D,3,FALSE)"
 On Error Resume Next
Range("C1:C" & LastRow).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
Range("C1:C" & LastRow).Value = Range("C1:C" & LastRow).Value
End Sub
Sheet1
No.    名称    相対的強さ    研究者
            
F03    精神力    ∞    アドラー博士
F04    筋力    10^38    フランケンシュタイン博士
A01    重力    10^0    アインシュタイン博士
A02    電磁気力    10^38    マクスウエル博士
Sheet2
ナンバー    ネーム    ボゾン    ボゾン質量    方程式
A03    弱い力    W,Zボゾン    有り    ワインバーグ・サラム理論
A04    強い力    グルーオン    有り    標準理論
A01    重力    重力子    無し    アインシュタイン方程式
A02    電磁気力    光子    無し    マクスウエル方程式
                

を、実行すると
A01    重力    10^0    無し    アインシュタイン方程式
A02    電磁気力    10^38    無し    マクスウエル方程式

となります。

下記を表示させるには、どこを修正すれば良いでしょうか?
ナンバー    ネーム    相対的強さ    ボゾン質量    方程式
A01    重力    10^0    無し    アインシュタイン方程式
A02    電磁気力    10^38    無し    マクスウエル方程式
・ツリー全体表示

【75567】Re:マクロで、同じ番号行だけを残す方法
発言  ザ 焼鳥男  - 14/5/18(日) 15:22 -

引用なし
パスワード
   Yuki様
ご丁寧なご回答有難う御座います。

>質問はよく考えて追加しないように解答者にとっては2重になりますから。
>ついでに性別も追加できるようにしておきました。
申し訳御座いません。

>使う場合は性別無しの下の行をコメントにして
>性別有りの下の行をコメントを外してください。
有難う御座います。

>御自分の質問だけでなく他の質問者の内容もチェックして
>自分だったらどう考えるかなとかしてみましょう。
>実践的で勉強になると思います。
そのように致します。

>' Dictionary に登録
>  Set Dic = CreateObject("Scripting.Dictionary")
>  For i = 2 To UBound(v)
>    Dic(v(i, 1)) = i
>  Next
このようにデータを、一旦、登録するのですね。
ここで、質問させて頂きました例は、6列しかないのですが、使っていますデータは、開示できないのですが、20列ぐらいあり、そのExcel シートも、現在、見直し中であり、変更される可能性が高いです。
>sht.Cells(1, 1).Resize(, 6).Value = Array("番号", "No.", "名前", "住所", "年齢", "特徴")
従いまして、

Sub macro1()
 Dim LastRow As Long
 LastRow = Worksheets("Sheet2").Range("A65536").End(xlUp).Row

'結果シートを準備
 Worksheets("Sheet2").Copy after:=Worksheets("Sheet2")
 ActiveSheet.Name = "RESULT"

'ファイル1から転記、不要な行を抹消
 Range("C1:C" & LastRow).Formula = "=VLOOKUP(A1,Sheet1!A:D,3,FALSE)"
 On Error Resume Next
 Range("C1:C" & LastRow).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
 Range("C1:C" & LastRow).Value = Range("C1:C" & LastRow).Value
End Sub


一旦、sheet2を、resulにコピーして、VLOOKUPコマンドを使って処理できないかと考えています。
上のコードを実行しますと、下記の「マクロ実行結果」になってしまいます。
理想の結果を得るには、コードのどこを修正すれば、良いでしょうか?

Shieet1
No.    名称    相対的強さ    研究者
            
F03    精神力    ∞    アドラー博士
F04    筋力    10^38    フランケンシュタイン博士
A01    重力    10^0    アインシュタイン博士
A02    電磁気力    10^38    マクスウエル博士

Sheet2 これが実際には20行あります。
ナンバー    ネーム    ボゾン    ボゾン質量    関連力    方程式    到達距離    関係者    備考
A03    弱い力    W,Zボゾン    有り    放射能、核融合    ワインバーグ・サラム理論    有限    フェルミ、グラショー     
A04    強い力    グルーオン    有り    原子力    標準理論    有限    グロス、湯川     
A01    重力    重力子    無し    遠心力、重力    アインシュタイン方程式    無限    ニュートン、ヒルベルト、ワイル、グロスマン     
A02    電磁気力    光子    無し    摩擦、モータ    マクスウエル方程式    無限    ディラック、ファラデー


マクロ実行結果
A01    重力    10^0    無し    遠心力、重力    アインシュタイン方程式    無限    ニュートン、ヒルベルト、ワイル、グロスマン     
A02    電磁気力    10^38    無し    摩擦、モータ    マクスウエル方程式    無限    ディラック、ファラデー     


理想
ナンバー    ネーム    相対的強さ    ボゾン質量    関連力    方程式    到達距離    関係者    備考
A01    重力    10^0    無し    遠心力、重力    アインシュタイン方程式    無限    ニュートン、ヒルベルト、ワイル、グロスマン     
A02    電磁気力    10^38    無し    摩擦、モータ    マクスウエル方程式    無限    ディラック、ファラデー     


いろいろと、自分で考えて、試していました。お返事が遅くなって、すいません。


>すこし待ったらsimpleさんから回答が付いたとは思うけど待てなかったので
しょう。

初心者で、要領がよく解りませんでした。お許し願います。
・ツリー全体表示

【75566】Re:マクロで、同じ番号行だけを残す方法
発言  カエムワセト  - 14/5/18(日) 11:44 -

引用なし
パスワード
   >よそのサイトですが

焼き鳥男さんは、あちらのラーメンマン参上さんですが・・・。
あちらで回答者が用事で出かける、ということでこちらに移られたようです。
すこし待ったらsimpleさんから回答が付いたとは思うけど待てなかったので
しょう。
・ツリー全体表示

【75565】Re:マクロで、同じ番号行だけを残す方法
発言  Yuki  - 14/5/18(日) 11:30 -

引用なし
パスワード
   こんにちは。

質問はよく考えて追加しないように解答者にとっては2重になりますから。
ついでに性別も追加できるようにしておきました。
使う場合は性別無しの下の行をコメントにして
性別有りの下の行をコメントを外してください。

御自分の質問だけでなく他の質問者の内容もチェックして
自分だったらどう考えるかなとかしてみましょう。
実践的で勉強になると思います。
よそのサイトですが
//www.moug.net/faq/viewforum.php?f=2
も参考にしてみられては。

Option Explicit

Sub TESTa()
  Dim Dic   As Object
  Dim v    As Variant
  Dim i    As Long
  Dim j    As Long
  Dim sht   As Worksheet
  Dim eRow  As Long
  
' result シートのチェック
  On Error Resume Next
  Set sht = Worksheets("result")
  If Err.Number = 0 Then
    sht.Cells.ClearContents   'シートがあったらクリア
  Else              '無かったら追加
    Set sht = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    sht.Name = "result"     '名前を result
  End If
  On Error GoTo 0
' ******************* 此処まで **************

  With Worksheets("Sheet1")
    v = .Range("A1").CurrentRegion.Value
  End With
' Dictionary に登録
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 2 To UBound(v)
    Dic(v(i, 1)) = i
  Next

' 性別有り ***** この↓1行
'  sht.Cells(1, 1).Resize(, 7).Value = Array("番号", "No.", "名前", "性別", "住所", "年齢", "特徴")
' 性別無し ***** この↓1行
  sht.Cells(1, 1).Resize(, 6).Value = Array("番号", "No.", "名前", "住所", "年齢", "特徴")
  
  eRow = 1
  With Worksheets("Sheet2")
'    .Cells(1, 1).Resize(, 5).Copy sht.Cells(eRow, 1)
    For i = 2 To .Range("B" & .Rows.Count).End(xlUp).Row
'      Dictionary の登録とあえば
      If Dic.Exists(.Cells(i, 2).Value) Then
'        行を追加してコピペ
        eRow = eRow + 1
        sht.Cells(eRow, 1).Value = eRow - 1
        .Cells(i, 2).Resize(, 1).Copy sht.Cells(eRow, 2)
      '性別有り ***** この↓ 2行
'        Worksheets("Sheet1").Cells(Dic(.Cells(i, 2).Value), 2).Resize(, 2).Copy sht.Cells(eRow, 3)
'        .Cells(i, 3).Resize(, 3).Copy sht.Cells(eRow, 5)
      '性別無し ***** この↓ 2行
        Worksheets("Sheet1").Cells(Dic(.Cells(i, 2).Value), 2).Resize(, 1).Copy sht.Cells(eRow, 3)
        .Cells(i, 3).Resize(, 3).Copy sht.Cells(eRow, 4)
      End If
    Next
  End With
End Sub
・ツリー全体表示

【75564】Re:マクロで、同じ番号行だけを残す方法
発言  ザ 焼鳥男  - 14/5/18(日) 10:13 -

引用なし
パスワード
   Yuki様、ご回答有難う御座います。
昨日から、困っておりましたが、非常に助かりました。
>データは正しく書きましょう・上記の場合全部不一致ですよ。
承知致しました。以後、注意したします。

申し訳御座いません。更に以下をご教示頂きましたら幸いです。
1、resultに、名前  梅尾  福田 の列の追加は可能でしょうか?
2、私は、超初心者で、以下の参考本を見ながら、そのまま使えるか?応用が出来ないか?を確認しながら、マクロを作ろうとしております。
しかし、今回の場合、本を見ても、そのまま使える例が無く、また応用も出来ませんでした。どうやれば、このようなコードが書けるようになるのでしょうか?もっと例題の多い本やネットのサイト等があるのでしょうか?
最初は、VBAも真似から入るはずだと考えるのですが、真似る材料を見つけることが出来ない状態です。
参考本
「すぐわかるExcel マクロ&VBAサンプル集」
「Excel VBA 逆引き辞典パーフェクト2013/2010/2007/2003対応」
「Excel VBAプログラミング ユーザーフォーム&コントロール
・ツリー全体表示

【75563】Re:マクロで、同じ番号行だけを残す方法
発言  Yuki  - 14/5/18(日) 8:42 -

引用なし
パスワード
   ▼ザ 焼鳥男 さん:
こんにちは、

>マクロ手順
>1、まずsheet1とsheet2がありsheet2を、新たに、新しいsheetにコピーして、タグ名を、「result」にします。
>2、sheet1のA列とsheet2のB列の番号を、比較して、同じ番号だけを残します。
>3、「result」のC列に、sheet1のB列(名前)の必要部分のみをコピーします。
>4、「result」のNoを、1から連番にします。
>
>1は
> Worksheets("Sheet2").Copy after:=Worksheets("Sheet2")
> ActiveSheet.Name = "RESULT"
>で、よいでしょう。
>
>しかし、2がわかりません。1つのsheet内での、重複比較は、本に載っていますが、別のシートの比較方法が不明なためです。
>
>3は、難解で、全く、解らないです。
>
>Sheet1
>No.    名前    性別
>B01    石川    女
>B02    森田    男
>A01    梅尾    女
>A02    福田    男
>
>
>Sheet2
>番号    No.    住所    年齢    特徴
>                
>1    A03    アメリカ    19歳    数学が得意
>2    A04    長野    19歳    数学が得意
>3    A01    東京    19歳    国語が得意
>4    A02    鹿児島    19歳    国語、英語、数学、運動が得意
>                
>
>ほしい結果(result)
>番号    No.    住所    名前    年齢    特徴
>                    
>1    A01    東京    梅尾    19歳    国語が得意
>2    A02    鹿児島    福田    19歳    国語、英語、数学、運動が得意

データは正しく書きましょう・上記の場合全部不一致ですよ。

Option Explicit

Sub TESTa()
  Dim Dic   As Object
  Dim v    As Variant
  Dim i    As Long
  Dim j    As Long
  Dim sht   As Worksheet
  Dim eRow  As Long
  
' result シートのチェック
  On Error Resume Next
  Set sht = Worksheets("result")
  If Err.Number = 0 Then
    sht.Cells.ClearContents   'シートがあったらクリア
  Else              '無かったら追加
    Set sht = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    sht.Name = "result"     '名前を result
  End If
  On Error GoTo 0
' ******************* 此処まで **************

  With Worksheets("Sheet1")
    v = .Range("A1").CurrentRegion.Value
  End With
' Dictionary に登録
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 2 To UBound(v)
    Dic(v(i, 1)) = Empty
  Next
  
  eRow = 1
  With Worksheets("Sheet2")
    .Cells(1, 1).Resize(, 5).Copy sht.Cells(eRow, 1)
    For i = 2 To .Range("B" & .Rows.Count).End(xlUp).Row
'      Dictionary の登録とあえば
      If Dic.Exists(.Cells(i, 2).Value) Then
'        行を追加してコピペ
        eRow = eRow + 1
        sht.Cells(eRow, 1).Value = eRow - 1
        .Cells(i, 2).Resize(, 4).Copy sht.Cells(eRow, 2)
      End If
    Next
  End With
End Sub
・ツリー全体表示

【75562】Re:マクロで、同じ番号行だけを残す方法
発言  ザ 焼鳥男  - 14/5/17(土) 22:51 -

引用なし
パスワード
   こんにちは、
すいません。再度、質問を記載します。

マクロ手順
1、まずsheet1とsheet2がありsheet2を、新たに、新しいsheetにコピーして、タグ名を、「result」にします。
2、sheet1のA列とsheet2のB列の番号を、比較して、同じ番号だけを残します。
3、「result」のC列に、sheet1のB列(名前)の必要部分のみをコピーします。
4、「result」のNoを、1から連番にします。

1は
 Worksheets("Sheet2").Copy after:=Worksheets("Sheet2")
 ActiveSheet.Name = "RESULT"
で、よいでしょう。

しかし、2がわかりません。1つのsheet内での、重複比較は、本に載っていますが、別のシートの比較方法が不明なためです。

3は、難解で、全く、解らないです。

Sheet1
No.    名前    性別
B01    石川    女
B02    森田    男
A01    梅尾    女
A02    福田    男


Sheet2
番号    No.    住所    年齢    特徴
                
1    A03    アメリカ    19歳    数学が得意
2    A04    長野    19歳    数学が得意
3    A01    東京    19歳    国語が得意
4    A02    鹿児島    19歳    国語、英語、数学、運動が得意
                

ほしい結果(result)
番号    No.    住所    名前    年齢    特徴
                    
1    A01    東京    梅尾    19歳    国語が得意
2    A02    鹿児島    福田    19歳    国語、英語、数学、運動が得意
・ツリー全体表示

342 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free