Excel VBA質問箱 IV

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

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


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

【77575】マッチしたら指定範囲を別シートへコピー
質問  soul-taker  - 15/10/26(月) 16:25 -

引用なし
パスワード
   初めて投稿致します。
よろしくお願いします。

・sheetA
 「A5:I20」に文字データが入っています。
 (途中に空白列有り。最終行は月度によって変動。)

・sheetB
 「A5:A30」に文字データが入っています。
 (途中に空白列有り。最終行は月度によって変動。)

・sheetAの「A5」列と同じ値のものがsheetBの「A5」列内に
 あった場合、その同じ値の行の「C列からI列」をsheetA→
 sheetBにコピーする。
 (sheetAもsheetBも都度、最終行が変わるので、文字デー
  タの範囲が変わる。)
・できれば、途中で並べ替えの作業等や作業列の作成はしたく
 ない。

 <例>
  【sheetA】
       A  B  C D E F G H I
    5  0001    ○ あ     ○ か
    6  0006    ○ い
    7
    8  0035        ○ ○ ○ き
    9  0018    ○ う         ○
    ・
    ・
    19  0099        ○   ○
    20  0102    ○ え
 

  【sheetB】
    sheetBは、最初はA列のみにデータがあり、C〜
    I列は空白の状態。
    5行目、6行目、9行目が、それぞれsheetAの5行目
    6行目、8行目と同じなので、それぞれのsheetAの
    A列でマッチしたC列〜I列をsheetBのC列〜I
    列にコピーして、下記の結果としたい。

       A  B  C D E F G H I
    5  0001    ○ あ     ○ か
    6  0006    ○ い
    7  0042
    8
    9  0035        ○ ○ ○ き
    10  0051
    ・
    ・
    30  0099        ○   ○


これを下記のように記述したところ、うまくいかずに悩んでい
ます。

Dim r1 As Range, r2 As Range, c As Range
Dim m As Variant

Sheets(A).Select

With Worksheets(A)
  Set r2 = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
End With
With Worksheets(B)
  Set r1 = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
End With
 
For Each c In r1
  m = Application.Match(c.Value2, r2, 0)
  If IsNumeric(m) Then
    r2.Item(m, 3).Resize(, 7).Copy c.Item(1, 3)
  End If
Next

別のところで、うまくいっていた事例を移植したのですが、
(実のところ、中身がきちんと理解できていないので)どこ
がマズイのかが見つけられませんでした。

どなたか、ご助言いただけますと助かります。
何とぞ、よろしくお願い致します。
・ツリー全体表示

【77574】Re:メール自動作成マクロの質問です
お礼  SHO  - 15/10/26(月) 9:41 -

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

ご助言ありがとうございました。
今回のソースは見当もつかず丸投げになってしまいました。
大変申し訳ありませんでした。
今後はメールアドレスを設定するなどしてすぐ気付けるようにします。

ソースありがとうございました。
ソースもとても親切なものを書いていただき感動しております。
このような書き方があるととても勉強になりました。

今回は本当にどうもありがとうございました。
・ツリー全体表示

【77573】Re:メール自動作成マクロの質問です
発言  γ  - 15/10/25(日) 23:52 -

引用なし
パスワード
   >まずはγさんのおっしゃる通り簡単な連結から始めていきたいと思います。
>ソースを考えていただいてもよろしいでしょうか?

連結から始めていきたいから、ソース作ってください、って変じゃないですか?
前進させる主体はあなただということをお忘れ無く。
ここはソースを受け取る場所じゃないです。
ご自分でできるところまでは、ご自分でトライしましょう。
もし詰まっているなら、どこが不明なのか、明らかにしましょう。

それと、もう少し反応をテンポ良くしたほうが良いと思います。
質問して、それに回答があったんですから、
返事くらい間を置かずにしてはどうですか?
お忙しいなら、いったん閉じましょう。
・ツリー全体表示

【77572】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/25(日) 19:42 -

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

もう、ご覧にならないかもしれませんが。

>他の人と共有されているファイルなので、残念ながら行番号を追加することはできないんです。

提案したコードは現在使われているリスト範囲の外の右側に行番号をセットしています。

ですから

  With ActiveSheet.AutoFilter.Range
    With .Offset(, .Columns.Count).Resize(, 1)
      .Formula = "=ROW()"
      ●ここでCopy して、クリップボードからの取り込み処理
      .ClearContents
    End With
  End With

このようにすれば、問題はないと思いますが?
・ツリー全体表示

【77571】Re:負荷のなくシートないのデータを取得...
お礼  Show  - 15/10/25(日) 5:14 -

引用なし
パスワード
   ▼β さん:
>▼Show さん:
>
>↑でいう「処理の前」というのは、「コピペの前」という意味です。

回答ありがとうございます。他の人と共有されているファイルなので、残念ながら行番号を追加することはできないんです。それから、フィルタを掛ける前に、データを取るという提案ですが、確かにこの方法しかないですね。フィルタは、データは絶えず入力されるので実際は、現状はフィルタを解除して実行しています。しょうがないですね。

ありがとうございました。
・ツリー全体表示

【77570】Re:メール自動作成マクロの質問です
発言  γ  - 15/10/24(土) 11:09 -

引用なし
パスワード
   以前のあなたの投稿を参考にしてコード例を作ってみました。
変数宣言は省略しています。

  s = ""
  GYOMAX = Cells(Rows.Count, 1).End(xlUp).Row
  GYO = 10
  Do Until GYO > GYOMAX
    strRec = Cells(GYO, 1).Text & Cells(GYO, 2).Text & Cells(GYO, 3).Text & Cells(GYO, 4).Text
'     lngREC = lngREC + 1
'    xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)"
'    ' レコードを出力
'     Print #intFF, strREC
    s = s & strRec & vbCrLf
    GYO = GYO + 1
  Loop
  objMAIL.body = s

A列のデータがある最終行までを対象に、4列の値を連結しています。
そのあたりの前提は明示されていないので、勝手に設定しましたが、
そちらで直してください。
・ツリー全体表示

【77569】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/24(土) 1:58 -

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

↑でいう「処理の前」というのは、「コピペの前」という意味です。
・ツリー全体表示

【77568】Re:メール自動作成マクロの質問です
発言  γ  - 15/10/23(金) 21:02 -

引用なし
パスワード
   ▼SHO さん:
>まずはγさんのおっしゃる通り簡単な連結から始めていきたいと思います。
>ソースを考えていただいてもよろしいでしょうか?
>よろしくお願いします。
どのあたりに詰まっているのでしょうか。

データのある領域を特定するところですか?
それはシートを見ているあなたのほうが有利なはずです。

領域の中のセルを文字列に変換するところですか?

できているところまで書いてもらえませんか?
・ツリー全体表示

【77567】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/23(金) 19:17 -

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

ふと思いつきました。
フィルターされていても列はすべて表示されていますね。
わからないのは、それが何行目だったかということでしょうかね。
処理の前に、フィルターリストの最後の列の次に、行番号をふっておく。

  With ActiveSheet.AutoFilter.Range
    With .Offset(, .Columns.Count).Resize(, 1)
      .Formula = "=ROW()"
    End With
  End With

で、その列も含めてコピペすれば、行番号が最後のセルに入っていますね。
・ツリー全体表示

【77566】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/23(金) 19:09 -

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

提示のコードはコピペ利用ですから、フィルターで非表示になっている行は取得不可能です。
私自身は使ったことがないのですが ADO を使ってシートを扱う方法もあるのかなとは思います。
そのほか身の、いくつか手はあるかもしれません。
でも、どうなんでしょうか、処理効率としてはコピペが早いのでは?

ところで、すべての行が必要なら、フィルターをかける前に、この処理をしたらいかがですか?
・ツリー全体表示

【77565】Re:メール自動作成マクロの質問です
発言  SHO  - 15/10/23(金) 17:03 -

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

コメントありがとうございます。
また返信遅れて申し訳ありません。

まずは件名のコメントありがとうございました。
無事表示させることが出来ました。

頂いた不明点なのですが、
>(1)列は複数にわたっているのですね。
そのとおりです。
>(2)文字列と文字列の間はどうするのですか?
空白等無く連結できれば大丈夫です
>(3) =C10 と突然、式のようなものがでてきているが、意味不明。
すみません。C10に時間が入っており、時間を引いておりました。

まずはγさんのおっしゃる通り簡単な連結から始めていきたいと思います。
ソースを考えていただいてもよろしいでしょうか?
よろしくお願いします。
・ツリー全体表示

【77564】Re:負荷のなくシートないのデータを取得...
質問  Show  - 15/10/23(金) 16:36 -

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

時間がかかりましたが、やりたいことは、一つの問題を除いてできるようになりました。基本的には、提案頂いた方法で(UsedRange)テキストをクリップボードにコピーして、それに対して、改行やタブは残したまま、正規表現で検索してます。改行やタブの情報から、位置情報を割り出して、見つけた値が実際にどのセルにあるのか計算してその後Selectしてます。

一つの問題とは、UsedRange を使っているのでフィルターが掛かっている列がテキストとして取れないことです。UsedRange を使わずにフィルターされているテキストも取り込む方法はありますか?教えて下さい。何か私の説明に不明な点があれば、教えて下さい。(実際問題として、フィルタされている情報は必要ないのですが、位置情報を割り出すときに、改行を数えて、見つけた列はワークシートの何行目か計算するときに、フィルタされて実際のワークシートの行数とコピーされたデータ内の行数が違うので、行の計算ができないのが問題です。UsedRange から生成されるRangeに対して、Cells を使って相対的にセルを特定できるかやってみましたが、だめでした。)
・ツリー全体表示

【77563】Re:マクロ実行後に「応答なし」
お礼  viaggio  - 15/10/23(金) 14:53 -

引用なし
パスワード
   >ウッシ様 

回答ありがとうございます。

VBAの知識もないまま、既存のものを切り貼りして
作っているので、よく意味も理解できませんが、

このまま使わせていただきましたら、
早くなりました。

今後、こちらを参考にさせて頂きたいと思います。

ありがとうございました。
・ツリー全体表示

【77562】Re:マクロ実行後に「応答なし」
回答  ウッシ  - 15/10/23(金) 14:36 -

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

原因は分かりませんが、コードの書き方で、変数の宣言を強制するように
ツール、オプションで設定しておきましょう。

Option Explicit

Sub 選択した項目の前回登録情報をコピー()
  Dim mSh As Worksheet
  Dim sR As Range
  Dim m  As String
  Dim rc As Variant
  Dim tSh As Worksheet
  
  On Error Resume Next
  Set tSh = Workbooks("151022_同一再稼働支援ツール.xlsm") _
        .Worksheets("登録票")
  On Error GoTo 0
  
  If tSh Is Nothing Then
    MsgBox "151022_同一再稼働支援ツール.xlsmが開かれていないか、" & _
        (Chr(10) & Chr(13)) & _
        "登録票シートが存在しません。" & _
        (Chr(10) & Chr(13)) & _
        "処理を中断します"
    Exit Sub
  End If
  
  Set mSh = ActiveWorkbook.ActiveSheet
  Set sR = Selection
    
  m = "選択しているセルの内容を、前回登録時の情報に書き換えます。"
  m = m & (Chr(10) & Chr(13))
  m = m & "この機能はセルの位置が完全一致している時のみ使用できます。"
  m = m & (Chr(10) & Chr(13))
  m = m & "よろしければ[OK]を押下してください。"
  
  rc = MsgBox(m, vbOKCancel + vbQuestion, "※要注意※")
 
  If rc = vbOK Then
    Workbooks("151022_同一再稼働支援ツール.xlsm") _
      .Worksheets("登録票").Range(sR.Address).Copy sR
  Else
    MsgBox "処理を中断します"
  End If
  
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
  Application.EnableEvents = True

End Sub

インデントを付けてコードを見やすく。

  Application.EnableEvents = True

としてあると言う事はチェンジイベントがあるのですか?

  Application.Calculation = xlCalculationAutomatic

の計算実行との順序は大丈夫ですか?
・ツリー全体表示

【77561】Re:コメントサイズの自動調整エラー
お礼  くまさん  - 15/10/22(木) 16:51 -

引用なし
パスワード
   ▼β さん:
以前にコメント頂いていた件、結局コメントを書き込むブックを再作成したところ、現象は収まりました。
色々アドバイスしていただき、ありがとうございました。


>▼くまさん さん:
>
>ついでに申し上げますと、item() の正体がわからなかったので
>Sub WComment(xlSheet As Worksheet, WMon As Long, WItem As Long)
>と変更し、プロシジャ内で、item と i を 参照しているコードも
>
>xlRange = xlRange.Value
>ComTxt = .Range("B5") & " " & .Range("D5") & " " & "PC"
>
>このように変更して実行してみましたが、何度やってもエラーにはなりません。
>
>もっとも xlRange や .Range("B5") や .Range("D5") に実際にはどんな値が入っているのかもわからないんですが。
・ツリー全体表示

【77560】Re:コメントサイズの自動調整エラー
お礼  くまさん  - 15/10/22(木) 16:49 -

引用なし
パスワード
   ▼ウッシ さん:
すいません、ブックを再作成するという考えが思いつきませんでした。
しかし、お陰様で色々勉強になりました。ありがとうございました。
・ツリー全体表示

【77559】マクロ実行後に「応答なし」
質問  viaggio  - 15/10/22(木) 16:33 -

引用なし
パスワード
   作成したマクロを実行し問題なく処理完了はするのですが、
その後、しばらく(1〜2分ほど)「応答なし」となり動作が止まります。
同一ファイルでも、同じような現象が起きるマクロと起きないマクロがあります。
原因や解決策、わかりましたら教えてください。
現象が起きるマクロの一例↓
------------------------------------------------------------
Sub 選択した項目の前回登録情報をコピー()

Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

bName = Excel.ActiveWorkbook.Name
sName = Excel.ActiveSheet.Name

S_R = Selection(1).Row
E_R = Selection(Selection.Count).Row
S_C = Selection(1).Column
E_C = Selection(Selection.Count).Column

rc = MsgBox("選択しているセルの内容を、前回登録時の情報に書き換えます。" & (Chr(10) & Chr(13)) & _
"この機能はセルの位置が完全一致している時のみ使用できます。" & (Chr(10) & Chr(13)) & _
"よろしければ[OK]を押下してください。", vbOKCancel + vbQuestion, "※要注意※")
  
    If rc = vbOK Then
    
     GoTo LABEL_1
      
      Else
     
     MsgBox "処理を中断します"
     Exit Sub
     End If

LABEL_1:
  
  Windows("151022_同一再稼働支援ツール.xlsm").Activate
  Worksheets("登録票").Activate
  Range(Cells(S_R, S_C), Cells(E_R, E_C)).Select

  Selection.Copy
  Windows(bName).Activate
  Worksheets(sName).Activate
  Range(Cells(S_R, S_C), Cells(E_R, E_C)).Select
  
  Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False
    
    Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
・ツリー全体表示

【77558】Re:コメントサイズの自動調整エラー
回答  ウッシ  - 15/10/22(木) 15:56 -

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

こちらでエラーが再現出来ない時点でブックを再作成して貰った方がいい
とは思ってたのですが・・・・

でも、コードも大分整理されましたし良かったですね。
・ツリー全体表示

【77557】Re:コメントサイズの自動調整エラー
お礼  くまさん  - 15/10/22(木) 15:22 -

引用なし
パスワード
   ▼ウッシ さん:
こんにちは。
コメントを設定するブックを新規に作りなおしたところ、なんと解決いたしました。
過去にxlsからxlsxに変換したのが影響していたのでしょうか・・・

結局原因のわからないままでしたが、長いことお付き合いいただきまして本当にありがとうございました。不具合としては大したことありませんでしたが、ずっと気になってはいたのでスッキリしました。
・ツリー全体表示

【77556】Re:メール自動作成マクロの質問です
発言  γ  - 15/10/21(水) 20:54 -

引用なし
パスワード
   >・件名に「日報」と今日の日付(MM月DD日(aaa)のフォーマット)が自動で入力される。
これは
  MsgBox "日報 " & Format(Date, "MM月DD日(aaa)")
が参考になるでしょう。

>  時間が入っているセルにはHH:MMのフォーマットで出力
> 10行目からのセルには
> 9:00 〜 9:15
> ○朝会    
> =C10 〜 0:00                
> みたいな感じで格納されています。

ここがわからない。
(1)列は複数にわたっているのですね。
(2)文字列と文字列の間はどうするのですか?
  各セルの.Textプロパティを単純に連結するのではだめなの?
(3) =C10 と突然、式のようなものがでてきているが、意味不明。

DataObjectを利用する方法もあるけど、まずは、
普通に繰り返しで、文字列を連結していったらどうでしょう。
・ツリー全体表示

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