Excel VBA質問箱 IV

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

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


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

【76754】Re:シート1とシート2の内容で一致するも...
発言  マナ  - 15/3/9(月) 19:27 -

引用なし
パスワード
   マクロの記録で作成する例です。
最後のメッセージボックスだけはちょっと無理でしたので
シート1のA列にコピペにしました。

1.Sheet3のA1に行挿入
2.Sheet3のA1に「大阪」と入力
3.Sheet3のB2に式入力 =COUNTIF(Sheet2!A:A,A2)
4.Sheet3のB列を下方向にフィルコピー
5.Sheet3でオートフィルター
6.Sheet3のB列で数値フィルター 0と等しくない
7.Sheet3のA列抽出行をSheet1のA列にコピペ
8.Sheet3のオートフィルター解除
9.Sheet3のB列削除
10.Sheet3の1行目を選択し行削除
・ツリー全体表示

【76753】検索後のHTML解析
質問  Satsuki  - 15/3/9(月) 18:37 -

引用なし
パスワード
   こんにちは、Satsukiと申します。
 
プルダウンで検索後に、検索結果の総ページ数を、
検索結果ページのHTMLを解析して取得したいのですが、
上手く取得できる時と、できない時があります。
どなたかご教示のほどよろしくお願いいたします。
 
Option Explicit
 
Private objIE As InternetExplorer
 
Sub main()
  Call GetPage(2, "httpから始まるURL")
  
  If Not objIE Is Nothing Then objIE.Quit
  Set objIE = Nothing
End Sub
 
Sub GetPage(row, url)
  Call Navigate(url)
  url = SelectPulldownMenu(objIE) ←プルダウン選択後のURL取得

  Dim PageNum As String
  PageNum = getMaxPage(objIE) ←プルダウン選択後のURLでページ数取得


  (ここは未完成) 

End Sub
 
Sub Navigate(url)
  If objIE Is Nothing Then Set objIE = New InternetExplorer
  If objIE.Visible <> True Then objIE.Visible = True
  objIE.Navigate2 (url)
  While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    DoEvents
    Sleep 100
  Wend
  Sleep 200
End Sub
 
Function SelectPulldownMenu(objIE) As String
  objIE.document.forms("color")("color_id").Value = "5"
  objIE.document.forms("color")("color_id").FireEvent ("OnChange")
  SelectPulldownMenu = objIE.LocationURL

  Call WaitFor(3)
End Sub

Function getMaxPage(objIE)
  Dim MaxPage As Integer
  MaxPage = 0
  Dim PageNum As String
  Dim objTag
 
  For Each objTag In objIE.document.getElementsByTagName("a")
    If objTag.className = "pagesu" Then
      PageNum = val(objTag.innerText)
      If PageNum > MaxPage Then
        MaxPage = PageNum
      End If
    End If
  Next
    getMaxPage = MaxPage
End Function

Function WaitFor(ByVal second As Integer)
  Dim futureTime As Date

  futureTime = DateAdd("s", second, Now)
  While Now < futureTime
    DoEvents
  Wend
End Function
・ツリー全体表示

【76752】Re:シート1とシート2の内容で一致するも...
発言  β  - 15/3/9(月) 17:20 -

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

こんなコードもあります。
シンプルですが、わかりにくいかも。

Sub Test()
  Dim dic As Object
  Dim dl As Object
  Dim i As Long
  Dim v As Variant
  Dim c As Range
  
  Set dic = CreateObject("Scripting.Dictionary")
  Set dl = CreateObject("System.Collections.ArrayList")
  
  With Sheets("Sheet2")
    For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
      dic(c.Value) = True
    Next
  End With
  
  With Sheets("Sheet3")
    For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
      If dic.exists(c.Value) Then dl.Add c.Value
    Next
  End With
  
  If dl.Count > 0 Then
    dl.Sort
    ReDim v(0 To dl.Count - 1)
    For i = 0 To dl.Count - 1
      v(i) = dl(i)
    Next
    MsgBox "以下の重複がありました" & vbLf & Join(v, vbLf)
  Else
    MsgBox "重複はありませんでした"
  End If
  
End Sub
・ツリー全体表示

【76751】Re:シート1とシート2の内容で一致するも...
発言  β  - 15/3/9(月) 16:49 -

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

シンプルな方法ということですので以下ではいかがですか?

1.Sheet2のA列をSheet1のA列にコピペ
2.Sheet1のA列を選択して、データタブの重複の削除でユニークな名前群にする
3.Sheet3にオートフィルター設定(1行目がタイトル行でなければいけませんが)
4.Sheet1のユニークになった名前を取り出して、Sheet3のA列をフィルタリング
5.抽出されたら、Sheet3の抽出領域を選択して、Sheet1 の下のほうにコピペ
6.この4.と5.をループで繰り返し

ループ以外はマクロ記録で基本的なコードが生成されますから、あとは、このコードで
固定になった部分を、がんばって変数化。

もちろん、もっと「VBA的な」処理方法は、いろいろありますが、
この方法が、結構わかりやすいですよ。
(一度、手作業で操作して確認してみてください)
・ツリー全体表示

【76750】シート1とシート2の内容で一致するものが...
質問  あや  - 15/3/9(月) 16:01 -

引用なし
パスワード
   はじめまして。BVA初心者のあやです。

シートが異なるものに関して検索をかけ、引っかかったものの結果を表示させたいのですが、どういうような組立で行えばよいか整理ができず、いろいろ試してはいますが上手くいきません。
アドバイスをいただけたらと思います。

例えばなのですが、
1.シート2のA列に東京都在住の人の名前が多数記入されていて、
 シート3のA列に大阪府在住の人の名前が多数記入されています
2.シート1上の”スタート”というボタンを押す
3.シート2の中にシート3と同じ名前の人がいるか探す
4.一致した場合はシート1上でメッセージボックスとかで結果表示させる
※シート2の名前の方をベースにし、シート3の中でシート2と同じものがあれば、シート3で見つかった方の結果を表示させたいです。

もし、同じ名前の人が複数いる場合(シート2:山田 一人、シート3:山田 三人)、
もしくは2と3で同じ苗字が多数いる場合(シート2:山田・佐藤、シート3:山田・佐藤)
はそれら全てを結果表示できるようにしたいのです。。。

結果表示例)|---------------|    |---------------|
      |検索結果:山田 |    |検索結果:山田 |
      |     山田 | や  |      佐藤 | など・・
      |     山田 |    |        |
      |---------------|    |---------------|

ネットや本でもいろいろ調べ、試してみましたが、なかなか上手くいきません・・・
どなたかご教授願います。
また、初心者の為、出来れば簡単なコードやシンプルなプログラムを使用したり、解説をしていただければとてもありがたいです。。。

みなさまどうぞよろしくお願い致します。
・ツリー全体表示

【76749】Re:集計について
お礼  ビギナー  - 15/3/7(土) 21:19 -

引用なし
パスワード
   β 様

ご連絡有り難うございます。
細かい点まで教えて下さり有り難うございます。

月曜日までエクセルが使用できないのですが、
月曜日になったら実際に動かしてみたいと思います。

お手数をおかけ致しました。
有り難うございます。


▼β さん:
>▼ビギナー さん:
>
>参考にする場合、こちらのコードのほうが比較しやすいですね。
>
>Sub 数式の埋め込みタイプ2()
>  
>  Sheets("Sheet2").Cells.Clear
>  Sheets("Sheet1").Columns("J").Copy Sheets("Sheet2").Range("A1")
>  Sheets("Sheet2").Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
>  Sheets("Sheet2").Range("A2", Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp)).Offset(, 1).Formula = _
>    "=SUMIFS(Sheet1!D:D,Sheet1!J:J,Sheet2!A2,Sheet1!C:C,""子供"")"
>
>End Sub
・ツリー全体表示

【76748】Re:集計について
お礼  ビギナー  - 15/3/7(土) 21:16 -

引用なし
パスワード
   マナ様

細かい点まで教えて下さり、有り難うございます。
現在、エクセルが使える状況ではないので、
試すことができないのですが、月曜日に試してみます。

色々と有り難うございました。


▼マナ さん:
>>Sheet1のJ列に各都道府県名、D列に数値、C列に「大人」「子供」・・表記です。
>
>いいかげんに読んでいました。
>訂正です。
>
>"=SUMIFS(Sheet1!C4,Sheet1!C10,Sheet2!RC1,Sheet1!C3,""子供"")"
>
>ただし、私も、最終的には、βさんが書かれたような
>R1C1形式ではなく、A1形式を使用することが多いです。
・ツリー全体表示

【76747】Re:集計について
発言  マナ  - 15/3/7(土) 10:35 -

引用なし
パスワード
   >Sheet1のJ列に各都道府県名、D列に数値、C列に「大人」「子供」・・表記です。

いいかげんに読んでいました。
訂正です。

"=SUMIFS(Sheet1!C4,Sheet1!C10,Sheet2!RC1,Sheet1!C3,""子供"")"

ただし、私も、最終的には、βさんが書かれたような
R1C1形式ではなく、A1形式を使用することが多いです。
・ツリー全体表示

【76746】Re:集計について
発言  β  - 15/3/7(土) 10:09 -

引用なし
パスワード
   ▼ビギナー さん:

参考にする場合、こちらのコードのほうが比較しやすいですね。

Sub 数式の埋め込みタイプ2()
  
  Sheets("Sheet2").Cells.Clear
  Sheets("Sheet1").Columns("J").Copy Sheets("Sheet2").Range("A1")
  Sheets("Sheet2").Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
  Sheets("Sheet2").Range("A2", Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp)).Offset(, 1).Formula = _
    "=SUMIFS(Sheet1!D:D,Sheet1!J:J,Sheet2!A2,Sheet1!C:C,""子供"")"

End Sub
・ツリー全体表示

【76745】Re:集計について
発言  β  - 15/3/7(土) 9:59 -

引用なし
パスワード
   ▼ビギナー さん:

マナさんや私のコメントを参考にして完成させてください。
今から外出するので、参考として。
ビギナーさんが最終的に完成されたコードと照らし合わせてください。

Sub 数式の埋め込みタイプ()
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  
  Set sh1 = Sheets("Sheet1")
  Set sh2 = Sheets("Sheet2")
  
  sh2.Cells.Clear
  sh1.Columns("J").Copy sh2.Range("A1")
  sh2.Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
  sh2.Range("A2", sh2.Range("A" & Rows.Count).End(xlUp)).Offset(, 1).Formula = _
    "=SUMIFS(Sheet1!D:D,Sheet1!J:J,Sheet2!A2,Sheet1!C:C,""子供"")"

End Sub
・ツリー全体表示

【76744】Re:集計について
発言  β  - 15/3/7(土) 9:47 -

引用なし
パスワード
   ▼ビギナー さん:

おはようございます

まだ、よく読んでいませんが

RemoveDuplicate これは、実際のデータは1行目がタイトル行ですから
Header:=xlYes が正しいです。実際の処理に害はないですけど。

それと、

>Sheet1!R[3]C[1] → Sheet1!”子供” にしたら動かなくなりました。 

Sheet1!R[3]C[1] これは 「セル」です。
B2に記入しますので、実際には Sheet1!C5 ですけど。
Sheet1!”子供” こんなセルはないですよね?
シート上のSUMIFS で、ここをセルではなく "子供" という固定値で与える場合は、どんな数式になりますか?
・ツリー全体表示

【76743】Re:集計について
発言  マナ  - 15/3/7(土) 9:35 -

引用なし
パスワード
   まずは、マクロ記録の数式部分を修正してみてください。

>"=SUMIFS(Sheet1!C[2],Sheet2!C[-1],Sheet2!RC[-1],Sheet1!C[1],Sheet1!R[3]C[1])"



"=SUMIFS(Sheet1!C11,Sheet1!C10,Sheet2!RC1,Sheet1!C12,""子供"")"


""子供""の部分は重要ポイントです。
ht tp://www.relief.jp/itnote/archives/017752.php
・ツリー全体表示

【76742】Re:集計について
質問  ビギナー  - 15/3/7(土) 6:13 -

引用なし
パスワード
   ご連絡有り難うございます。
実際に動かしたマクロをはり付けます。
ただ、質問文に書かせて頂いたものと、実際の表は若干異なっています。
Sheet1のJ列に各都道府県名、D列に数値、C列に「大人」「子供」・・表記です。
また、1行目は項目名で数値が実際に入るのは2行目からです。

worksheets("Sheet1").select
Columns("J:J").Select
&#160; &#160; Selection.Copy
&#160; &#160; Sheets("Sheet2").Select
&#160; &#160; Columns("A:A").Select
&#160; &#160; ActiveSheet.Paste
&#160; &#160; Application.CutCopyMode = False
&#160; &#160; ActiveSheet.Range("$A$1:$A$22717").RemoveDuplicates Columns:=1, Header:= _
&#160; &#160; &#160; &#160; xlNo
&#160; &#160; Sheets("Sheet2").Select
&#160; &#160; Range("B2").Select
&#160; &#160; ActiveCell.FormulaR1C1 = _
&#160; &#160; &#160; &#160; "=SUMIFS(Sheet1!C[2],Sheet2!C[-1],Sheet2!RC[-1],Sheet1!C[1],Sheet1!R[3]C[1])"
&#160; &#160; Range("B2").Select
&#160; &#160; Selection.AutoFill Destination:=Range("B2:B326")
&#160; &#160; Range("B2:B326").Select
End Sub

上記のものでは、動きはしましたが、数値が正確ではなく、
sumifsの最後の部分 Sheet1!R[3]C[1] → Sheet1!”子供” にしたら動かなくなりました。 

お手数をおかけ致しますが、
よろしくお願い致します。


▼マナ さん:
>> =SUMIFS(Sheet1B列、Sheet2A列、Sheet2A1,Sheet1C列、Sheet1C列”子供”)
>>
>>どこかに間違いがあると思うのですが、
>>いかがでしょうか。
>
>実際に動かしてみたコードを示していただけると解決が早いと思います。
>(できれば他の部分も含めて)
・ツリー全体表示

【76741】Re:集計について
発言  マナ  - 15/3/6(金) 22:58 -

引用なし
パスワード
   > =SUMIFS(Sheet1B列、Sheet2A列、Sheet2A1,Sheet1C列、Sheet1C列”子供”)
>
>どこかに間違いがあると思うのですが、
>いかがでしょうか。

実際に動かしてみたコードを示していただけると解決が早いと思います。
(できれば他の部分も含めて)
・ツリー全体表示

【76740】Re:集計について
質問  ビギナー  - 15/3/6(金) 20:43 -

引用なし
パスワード
   すみません。

追加で質問があります。
条件に変化があり、
C列に「大人」「子供」「その他」という項目が追加されたとします。
そのためA列はひとつの都道府県ごとにセルを3つ使い、B列にはC列の「大人」「子供」「その他」のそれぞれに対応する数値が入るようになります。

そして、Sheet2は子供の合計数(数はB列からもってきます)だけを集計したいとします。

その場合最後は下記の指示のsumifをsumifsにし、
条件の一つに「子供」も追加することで対応できると考えました。
=SUMIFS(Sheet1B列、Sheet2A列、Sheet2A1,Sheet1C列、Sheet1C列”子供”)としたのですが、
"子供"部分にデバックが発生しました。そのため、代わりにC2にしたらマクロは動いたのですが、
集計は正確にできておりませんでした。

どこかに間違いがあると思うのですが、
いかがでしょうか。

質問がばかりで申し訳ございませんが、よろしくお願い致します。


>・Sheet1を選択
>・A列を選択
>・Ctrl/c
>・Sheet2を選択
>・A1を選択
>・Ctrl/v
>・Escキー
> ・データタブの重複の削除を実行
>・B1に =SUMIF(Sheet1!A:A,A1,Sheet1!B:B) を入力
>・これを下にフィルコピー
・ツリー全体表示

【76739】Re:日にち
お礼  まさ  - 15/3/6(金) 19:10 -

引用なし
パスワード
   独覚さん:

今試したところ、イメージ通りに機能しました。
大変助かりました。ありがとうございました。
>独覚 さん:
>
>お忙しい所、ありがとうございます。
>月曜日試して、結果をご連絡いたします。
>取り急ぎ、ありがとうございました。
>
>▼独覚 さん:
>>標準モジュールに
>>
>>
>>Sub tst()
>>  Dim LOOP_CNT  As Long
>>  
>>   LOOP_CNT = 1
>>  
>>   Do Until Cells(LOOP_CNT, "A") = "" And Cells(LOOP_CNT, "B") = ""
>>    Cells(LOOP_CNT, "C") = WorksheetFunction.Max(Cells(LOOP_CNT, "A"), Cells(LOOP_CNT, "B")) + 60
>>    LOOP_CNT = LOOP_CNT + 1
>>  Loop
>>  
>>End Sub
>>で、どうでしょうか?
>>
>>プロシージャ名は「tst」でなくわかりやすいもので結構です。
>>プログラムの流れとしては1行目から見て行ってA列・B列両方が空白の行まで見て行きます。
>>
>>なお、C列はあらかじめ表示形式を「日付」にしておいてください。
・ツリー全体表示

【76738】Re:日にち
お礼  まさ  - 15/3/6(金) 18:46 -

引用なし
パスワード
   独覚 さん:

お忙しい所、ありがとうございます。
月曜日試して、結果をご連絡いたします。
取り急ぎ、ありがとうございました。

▼独覚 さん:
>標準モジュールに
>
>
>Sub tst()
>  Dim LOOP_CNT  As Long
>  
>   LOOP_CNT = 1
>  
>   Do Until Cells(LOOP_CNT, "A") = "" And Cells(LOOP_CNT, "B") = ""
>    Cells(LOOP_CNT, "C") = WorksheetFunction.Max(Cells(LOOP_CNT, "A"), Cells(LOOP_CNT, "B")) + 60
>    LOOP_CNT = LOOP_CNT + 1
>  Loop
>  
>End Sub
>で、どうでしょうか?
>
>プロシージャ名は「tst」でなくわかりやすいもので結構です。
>プログラムの流れとしては1行目から見て行ってA列・B列両方が空白の行まで見て行きます。
>
>なお、C列はあらかじめ表示形式を「日付」にしておいてください。
・ツリー全体表示

【76737】Re:日にち
回答  独覚  - 15/3/6(金) 16:28 -

引用なし
パスワード
   標準モジュールに


Sub tst()
  Dim LOOP_CNT  As Long
  
  LOOP_CNT = 1
  
  Do Until Cells(LOOP_CNT, "A") = "" And Cells(LOOP_CNT, "B") = ""
    Cells(LOOP_CNT, "C") = WorksheetFunction.Max(Cells(LOOP_CNT, "A"), Cells(LOOP_CNT, "B")) + 60
    LOOP_CNT = LOOP_CNT + 1
  Loop
  
End Sub
で、どうでしょうか?

プロシージャ名は「tst」でなくわかりやすいもので結構です。
プログラムの流れとしては1行目から見て行ってA列・B列両方が空白の行まで見て行きます。

なお、C列はあらかじめ表示形式を「日付」にしておいてください。
・ツリー全体表示

【76736】Re:オートフィルタが急に動かなくなり実...
発言  kanabun  - 15/3/6(金) 13:52 -

引用なし
パスワード
   ▼さとちぃ さん:

>解決できましたので

よく分からないのですが、結局 何が原因で

> オートフィルタが、急に動かなくなった。

のでしょうか?
・ツリー全体表示

【76734】Re:オートフィルタが急に動かなくなり実...
発言  さとちぃ  - 15/3/6(金) 11:06 -

引用なし
パスワード
   すみません、ご質問しておいてなんですが、解決できましたので
ご報告いたします。

(解決方法)
検索する一覧表のあるシートにて保存した状態で、ファイルを閉じる

ただ、上記の方法ですと、なんのためにワークシートを指示しているのか
という疑問が湧いてきました。

私のコードで、改善する点がありましたら、ご指摘いただけませんでしょうか?
・ツリー全体表示

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