Excel VBA質問箱 IV

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

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


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

【79091】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/4(木) 9:51 -

引用なし
パスワード
   ▼のんびり さん:

現在のコードをベースに考えてみました。
判定用の変数を1個使います。

--------
あずは、現在のコード

for m=1 to …MMシートをループ
  for j=1 to …JCBシートをループ
    If 同じデータなら then
      転記
    end if
  next j
next m


--------
これを、こんな感じで
内側のループが終わってから転記するようにします。

Dim 整合 as boolean

for m=1 to …MMシートをループ
  整合=False
  for j=1 to …JCBシートをループ
    If 同じデータなら then
      整合=True
      Exit For
    end if
    If 整合=True then
      転記
    end if
  next j
next m

--------

で、整合=Falseなら転記するようにすれば
不整合のデータのみ転記になるかも。
・ツリー全体表示

【79090】Re:オブジェクトが 必要ですというエラー...
発言  γ  - 17/5/3(水) 23:18 -

引用なし
パスワード
   反応がないですね。

折角こちらを閲覧された方のために、有益と思われることを書きます。
それは、「自分で作った変数は小文字で始めるとよい」というものです。

(1)VBAの予約語や、既定のオブジェクトのメソッドやプロパティは
  すべからく大文字で始まります。
  従って、上記ルールを守ると、判別が視覚的につくので便利です。

(2)小文字で入力しても、上記の予約語等は自動的に第一文字が大文字に
  変換されます。
  ですから逆に予約語等のつもりで入力して大文字にならなかったら、
  タイプミスしていることがわかります。
  (もっとも、インテリセンスによる自動メンバ表示を利用することが先ですが)

今回のケースでは、
・まずは Option Explicitの記入(自動設定オプションのセット)が必要だった
・小文字で始めていれば、大文字にかわらないので、既定のオブジェクトでも
 なんでもないことが直ぐに分かったはずです。
・ツリー全体表示

【79089】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 21:50 -

引用なし
パスワード
   ▼のんびり さん:

>不要な部分も入っているかと思います

現在のコードで気になることが、もう1点。

もし、一致していたら、内側のループからExit forしないと、
無駄に確認を続行することになります。
・ツリー全体表示

【79088】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 21:23 -

引用なし
パスワード
   ▼のんびり さん:

A列C列D列E列が同じものがMMシートにあれば、整合データ
A列C列D列E列が同じものがMMシートになければ、不整合データ

という考えでよいですか。

だとすると、作業列を使って

MMシートのF列にこんな式を入れます。
=A2&"@"&C2&"@"&D2&"@"&E2

で、JCBシートのF列は
=COUNTIF(MMシート!F:F,A2&"@"&C2&"@"&D2&"@"&E2)

これで、1の場合が整合データ、0が不整合データになりませんか。
あとは、オートフィルタで抽出しコピペ
もしくは、フィルタオプションで直接抽出結果を転記

ということを、マクロにするとできそうです。
まずは手作業で、試してみるとよいです。


整合データだけならもっと簡単に作業列使わなくても
フィルタオプションだけで転記できそうですが、
不整合データが思いつきませんでした。
・ツリー全体表示

【79087】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 20:33 -

引用なし
パスワード
   ▼のんびり さん:

JCBデータとマスターマネーデータは同じ構成ですか
・ツリー全体表示

【79086】Re:CSVで重複しないデータを抜き出し...
質問  のんびり  - 17/5/3(水) 20:10 -

引用なし
パスワード
   先ほどのVBAに一部コメントをつけました。


  Const JCB_SYA As Integer = 1     '「JCBデータ」ワークシートの「ご利用者」の列
  Const JCB_BI As Integer = 3     '「JCBデータ」ワークシートの「ご利用日」の列
  Const JCB_SAKI As Integer = 4    '「JCBデータ」ワークシートの「ご利用先など」の列
  Const JCB_KINGAKU As Integer = 5   '「JCBデータ」ワークシートの「ご利用金額(¥)」の列

紛らわしいのですが、「整合データ」と同じく「不整合データ」でも
3、5、4、1の順に列を作りたいと思っています。
どうお伝えするのが一番お手間じゃないのかわからず、こんな伝え方でごめんなさい。
・ツリー全体表示

【79085】Re:CSVで重複しないデータを抜き出し...
質問  のんびり  - 17/5/3(水) 20:01 -

引用なし
パスワード
   ▼マナ さん:
>▼のんびり さん:
>偶然、金額が同じデータというものが存在するのでは?

おっしゃる通りです。
とりあえずできるところからと考えて作っていたので
(自分で作る計画の中で)
そこまではカバーしきれないかと思って条件に入れていませんでした。
カバーできるとうれしいですが…

>
>参考までに、できてる3を提示してもらえますか。

不要な部分も入っているかと思います。お見苦しいと思いますが、以下です。


Sub データ照合()
  Const JCB_SYA As Integer = 1   
  Const JCB_BI As Integer = 3     
  Const JCB_SAKI As Integer = 4    
  Const JCB_KINGAKU As Integer = 5  

  Const MM_KINGAKU As Integer = 5  
  
  Const S_KINGAKU As Integer = 2   

  Dim j As Integer   
  Dim m As Integer    
  Dim Cnt As Integer  
  
  Dim JCBKiten As Range 
  Dim MMKiten As Range 
  Dim SeiKiten As Range 

  Cnt = 1        

  Set JCBKiten = Worksheets("JCBデータ").Range("A5")
  Set MMKiten = Worksheets("マスターマネーデータ").Range("A5")
  Set SeiKiten = Worksheets("整合データ").Range("A5")

For m = 1 To MMKiten.CurrentRegion.Rows.Count

 For j = 1 To JCBKiten.CurrentRegion.Rows.Count
    
    If JCBKiten.Cells(j, JCB_KINGAKU).Value = MMKiten.Cells(m, MM_KINGAKU).Value Then

       SeiKiten.Cells(Cnt, 1).Value = _
         JCBKiten.Cells(j, JCB_BI).Value
         
       SeiKiten.Cells(Cnt, 2).Value = _
         JCBKiten.Cells(j, JCB_KINGAKU).Value
         
       SeiKiten.Cells(Cnt, 3).Value = _
         JCBKiten.Cells(j, JCB_SAKI).Value

       SeiKiten.Cells(Cnt, 4).Value = _
         JCBKiten.Cells(j, JCB_SYA).Value


      Cnt = Cnt + 1 
    End If
  Next j
  
Next m
  
    
End Sub
・ツリー全体表示

【79084】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 20:00 -

引用なし
パスワード
   ▼のんびり さん:

追加で質問です。

>いくつかの列を選んで抽出したいです。

ならば各ファイルの各列の項目名を教えてください
・ツリー全体表示

【79083】Re:CSVで重複しないデータを抜き出し...
発言  マナ  - 17/5/3(水) 19:54 -

引用なし
パスワード
   ▼のんびり さん:
偶然、金額が同じデータというものが存在するのでは?

参考までに、できてる3を提示してもらえますか。
・ツリー全体表示

【79082】Re:CSVで重複しないデータを抜き出し...
質問  のんびり  - 17/5/3(水) 19:36 -

引用なし
パスワード
   補足です。

重複しない、というのは
「金額」のみを比べるということでokです。
説明不足で申し訳ございません。
・ツリー全体表示

【79081】CSVで重複しないデータを抜き出したい
質問  のんびり  - 17/5/3(水) 19:31 -

引用なし
パスワード
   VBA初心者です。

4つのワークシート中、2つに
「日付」や「店」「金額」などといったデータが入っています。
この中から「金額」が重複していないデータを抽出したいと思っています。

具体的に説明すると
1.クレカデータ(金額がE列の5行以降に入っている)
2.家計簿データ(金額がE列の5行以降に入っている)
3.整合データ(金額をB列の5行以降に入れる)※作成済み
4.不整合データ(金額をB列の5行以降に入れる)←これを作りたい


1.に入っているが2.に入っていない1.のデータを抽出し
4.に入れたい。
抽出するデータも行まるごとではなく
いくつかの列を選んで抽出したいです。

ちなみに、1.と2.の金額が一致するデータを抽出することは成功していて
3.に入っている。それを使用することも可能です。

一致ができたので、不一致も簡単かと思いきや
全然違いますよね…??
色々と調べてみたのですが理解できず、自分のものにカスタマイズできずにいます。

ゴールデンウィークのお休みの所恐縮です。
よろしくお願いいたします。
・ツリー全体表示

【79080】Re:一つ下のセルに連番を入れたい
発言  マナ  - 17/5/2(火) 18:29 -

引用なし
パスワード
   ▼ポチョムキン さん:

本題と別に、

>Sheets("SHEET1").Range("C99999").End(xlUp)

もし、ボタンがあるシートに対し実行するのであれば

Sheets("SHEET1").は不要で

Range("C99999").End(xlUp)

これだけもよいです。

また、"C99999" が、想定される最大行数より大きい値という意味なら
こんな記述もできます。

Range("C" & Rows.Count).End(xlUp)
・ツリー全体表示

【79079】Re:一つ下のセルに連番を入れたい
発言  マナ  - 17/5/2(火) 18:23 -

引用なし
パスワード
   ▼ポチョムキン さん:

マクロの記録で、キーワードが AutoFill かなと予想をつけます。

で、「AutoFill エクセル」でネット検索すると
例えばこんなのがみつかります。

ht tp://www.moug.net/tech/exvba/0050146.html


そこの使用例をまねすると、こんな感じです。

Sub test()
  
  With Sheets("SHEET1").Range("C99999").End(xlUp)
    .AutoFill Destination:=.Resize(2)
  End With
  
End Sub

あるいは、

Sub test2()
  Dim r As Range
  
  Set r = Sheets("SHEET1").Range("C99999").End(xlUp)
  r.AutoFill Destination:=r.Resize(2)

End Sub
・ツリー全体表示

【79078】Re:一つ下のセルに連番を入れたい
お礼  ポチョムキン  - 17/5/2(火) 17:28 -

引用なし
パスワード
   マナさん

早速のご連絡、ありがとうございます。

実はそれも試してみたのですが、自分の読解力と応用力がなく
フィルコピー範囲を「アクティブセルとその一つ下のセル」という
式に変更ができなかった経緯がございます。

申し訳ございませんが、GWの関係上、次に本ページを確認できるのが
週明けとなってしまうこと、お詫び申し上げます。
・ツリー全体表示

【79077】Re:一つ下のセルに連番を入れたい
発言  マナ  - 17/5/2(火) 16:25 -

引用なし
パスワード
   ▼ポチョムキン さん:

>その先がどうしてもうまくいきません。

1)「X0003」のセルを選んで、
2)1個下にフィルコピー

この操作を、「マクロの記録」してはどうでしょうか。
・ツリー全体表示

【79076】一つ下のセルに連番を入れたい
質問  ポチョムキン  - 17/5/2(火) 15:55 -

引用なし
パスワード
   VBA初心者です。

下記のようなことを行いたいのですが、どのようにすればよいでしょうか。

あるセルに文字列がある(たとえば「X0001」)
ボタンを押すと、「X0001」の下のセルに「X0002」と入力される。
さらにボタンを押すと、「X0002」の下のセルに「X0003」と入力される。

「X0001」がC列にある場合、まず「X0001」を探しにいくため、
ActiveCell = Sheets("SHEET1").Range("C99999").End(xlUp)
と、探しにいこうと思っていますが、その先がどうしてもうまくいきません。

先輩方、お教えいただければ幸いです。
・ツリー全体表示

【79075】Re:オブジェクトが 必要ですというエラー...
回答  γ  - 17/5/1(月) 18:55 -

引用なし
パスワード
   MaxRow = Cells(MaxRows.Count , 2).End(xlUp).Row
は、
MaxRow = Cells(Rows.Count , 2).End(xlUp).Row
の間違いでしょう。
テキストか何かの写し間違いですか?

その昔は、
MaxRow = Cells(65536, 2).End(xlUp).Row
などと直接、数値を書いていたものですよ。

しかし、Excelのバージョンアップで最大行数が拡大され、
これでは適当でないし、いちいち数値を書くのはいかがなものか、となって、
行数をカウントして、それで最終行を指定することになったのですね。

# これで解決して安心せずに、設定の変更は実行してください。
# 補足すると、
# Option Explicitとは、「変数の宣言をきちんとします」という宣言です。
# そのかわり、宣言していない変数を使っていれば、Excel君がきちんと
# 指摘をしてくれます。
# タイプミスをして変数名の間違いに気づくのに相当時間がかかってしまう、
# などということが避けられますし、大抵のひとはこうした設定にしています。
・ツリー全体表示

【79074】Re:オブジェクトが 必要ですというエラー...
回答  γ  - 17/5/1(月) 18:30 -

引用なし
パスワード
   MaxRowsとは何者でしょうか?
定義されていない変数を使っているのでは?

こうしたことを早期に発見するには、
以下のようにします。

Option Explicit
をモジュールの一行目に挿入するようにして下さい。
そうすれば、今回のような未宣言の変数には警告が出て、
しかも場所を特定してくれますから、原因が直ぐに判明します。

なお、
ツール − オプション − 編集 で
「変数の宣言を強制する」にチェックを入れておけば、
モジュールを作成した時点で、Option Explicitが自動的に挿入されるので、
手間が省けます。
一度だけチェックを入れておけば、以後、気にする必要はありません。
お薦めします。
・ツリー全体表示

【79073】オブジェクトが 必要ですというエラーが...
質問  ざべす  - 17/5/1(月) 17:18 -

引用なし
パスワード
   初めてこちらで質問をさせて頂きます。
業務でツールを作成するにあたり、下記のエラーが発生してしまいます。
状況としては、FindFileで開いたユニークファイルに対し、MaxRowsで指定の列の最大行数を求めようとすると変数にMaxRowの値を格納するコードでエラーが起きます。

コードは下記のように書いています。

Dim MaxRow As Variant

Application.FindFile

MaxRow = Cells(MaxRows.Count , 2).End(xlUp).Row  ⬅ここでエラー【オブジェクトが必要です】が発生

アドバイス、ご意見など頂ければ幸いです。
・ツリー全体表示

【79072】Re:VBAを用いて日付を自動判別して、その...
発言  マナ  - 17/4/25(火) 20:52 -

引用なし
パスワード
   ▼せいじ さん:

はい、そうです。
・ツリー全体表示

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