Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Excel 2010)
コメント取得マクロの取得位置変更について
投稿日時: 17/12/01 19:12:29
投稿者: まさ77

お世話になっています。
エクセルでコメントされているコメントのみ抽出し
新しいシートに表示させるマクロを使用しています。
マクロ自体ほぼ無知で簡単なコードの意味しかわかりません。
下記変更についてお教え
頂きたく。
質問者側のルールから外れる可能性もあると自覚はしております。
 
 
まず現在使用しているマクロです。
 
  Dim Sh As Worksheet
  Dim C As Comment
  Dim v()
  Dim r As Range
  Dim i As Long, j As Long, Cnt As Long
  Set Sh = ActiveSheet
  Cnt = Sh.Comments.Count
  If Cnt = 0 Then Exit Sub
  ReDim v(1 To Cnt, 1 To 4)
  For i = 1 To Cnt
    Set C = Sh.Comments.Item(i)
    Set r = C.Parent
    v(i, 1) = Sh.Cells(r.Row, 1).Value
    v(i, 2) = C.Text
    For j = 1 To 2
      With Sh.Cells(j, r.Column)
        If Len(.Value) > 0 Then
          v(i, 2 + j) = .Value
        Else
          v(i, 2 + j) = .End(xlToLeft).Value
        End If
      End With
    Next j
  Next i
  Worksheets.Add.Range("A1").Resize(Cnt, 4).Value = v
 
フォーム変更についてに伴い、抽出される場所が変わってしまいました。
現在のフォームは
           AJ   AK AL AM AN
5 12月1日
6    昼            夜
10 生産数  使用数  順 保有
13
14
15
 
 
上記のようなシートで約1カ月分作られています。
AJ5:AQ5まで結合
AJ6:AM6まで結合
上記の連続1カ月分。
行は120ほど使用。
 
上記マクロの数字部分を変更し試したんですが
上手くいかず。
どの部分を変更すると列、行の参照場所がかわるのか、
3列毎から4列毎に変更したんで、そこもどこか
ヒントでもいいのでお教え頂ければ助かります。
手打ちのため、簡易表も分かりにくくてもうしわけありません。
 

回答
投稿日時: 17/12/01 20:00:40
投稿者: もこな2

ちょっとわからない部分があるので確認です。

引用:
エクセルでコメントされているコメントのみ抽出し新しいシートに表示させるマクロを使用しています
ここのコメントされているコメントってなんですか?
 
引用:
上記マクロの数字部分を変更し試したんですが上手くいかず。
どの部分を変更すると列、行の参照場所がかわるのか、3列毎から4列毎に変更したんで、そこもどこかヒントでもいいのでお教え頂ければ助かります。
どこをどのように変更してどう試したら、どのようにうまくいかなかったんでしょうか?
 
ここら辺がわからないと問題点がわかりません。
 
もしかしてこうですかね。。。。
 
特定のセル範囲にコメントが設定されている場合、その内容が入って入れば、他のシートに順に書き出すマクロがあります。
今回、シート上のレイアウト(セル結合等)を変えたらうまく動かなくなってしまったのでどこを直せばいいのか教えてほしい。

回答
投稿日時: 17/12/01 22:15:29
投稿者: simple

重複しますけど。
 
>どの部分を変更すると列、行の参照場所がかわるのか、
>3列毎から4列毎に変更したんで、そこもどこか
>ヒントでもいいのでお教え頂ければ助かります。

されたいことがさっぱりわかりません。
コードのことは忘れて、
まずあなたが実現したいことを箇条書きしてください。日本語で。

投稿日時: 17/12/01 22:49:21
投稿者: まさ77

お世話になっております
 
言葉足らずでもうしわけありません。
生産数には入力された生産数が入っています。
順には生産数が入力されてる機種に対し順番のみ打ち込みます。
使用数と保有は数式にて拾ってきたり計算されてる仕様です。
生産数セルにコメントとして、通常の生産数とは別に作成する詳細や台数がランダムに入力されています。
ランダムとは作成依頼があるときだけで不定期です。
 
したいことは下記の通りです。
列で日付と昼夜、コメントの内容を取得したいのです。
 
例えば
  A     B     C
1 12月1日 昼   コメントの内容
2 12月3日  夜   コメントの内容
 
 
みたいな感じです。

回答
投稿日時: 17/12/02 00:01:34
投稿者: もこな2

え〜っとですね・・・・
 

引用:
生産数には入力された生産数が入っています。
そりゃそうなんでしょうけど、回答者には「生産数(セル)」がどこかすぐには解りません。
(回答者も絶対ではないので、書いてあっても気づかないことも多々あるんです。。。)
どの列に〜〜が入っていてという説明をしていただくとわかりやすいように思います。
 
引用:
AJ   AK AL AM AN
5 12月1日
6    昼            夜
10 生産数  使用数  順 保有
13
14
15
  
  
上記のようなシートで約1カ月分作られています。
AJ5:AQ5まで結合
AJ6:AM6まで結合
上記の連続1カ月分。
行は120ほど使用。

引用:
>生産数セルにコメントとして、通常の生産数とは別に作成する詳細や台数がランダムに入力されています。
ランダムとは作成依頼があるときだけで不定期です。
引用:
したいことは下記の通りです。
列で日付と昼夜、コメントの内容を取得したいのです。
  
例えば
  A     B     C
1 12月1日 昼   コメントの内容
2 12月3日  夜   コメントの内容
まとめると、こうですかね。。。
 
入力用のシートに以下のようなデータがあります。
5行目の「AJ〜AQ」をセル結合して”12月1日”
6行目の「AJ〜AM」をセル結合して"昼"、「AN〜AQ」をセル結合して"夜"
10行目には見出しとして、AJ(AN)から右方向へ順番に生産数、使用数、順、保有って入力されています。
入力エリアは13行目以降で、だいたい120行ほど使用しています。
そして、この1日分をワンセットとして、右方向へ同じ項目で繰り返して、1ヶ月分のデータを入力するようになっています。
 
この状態の時に、生産数(AJやAN・・・・)のところにコメントとして(詳細や台数)を入力するようにしており、マクロを実行したら、別シートに日付順の昼夜順にコメントの内容を抽出するようなマクロを組みたいです。
なお、必要な生産セルだけにコメントを付けているので、すべての生産数セルにコメントがついているものではないです。
 
一応、マクロで自動的に反映されるシステムになっていたんですが、入力フォーマットをいじったら、反映されなくなってしまったので、これをなんとか動くように改造したいんです。
 

回答
投稿日時: 17/12/02 04:26:04
投稿者: baoo

皆さん書いてる通りです。
元々のシートの構成がどうで、変更後の構成がどう変わったかが
分からないと答えるのが難しい。
あなたの業務には興味無いので生産数とかはどうでも良いです。
日付もどうでも良い。
これらは補足情報という程度です。
 
そうじゃなくて、このコードを見る限り、
1.コメントのある行のA列の値(行見出し)
2.コメント内容そのもの
3.コメントのある列の1行目の値(列見出し、結合あり)
4.コメントのある列の2行目の値(列見出し、結合あり)
を取得して新規に作成したシートに貼り付けている。
だから、一番回答者が知りたいのはレイアウトや構成を
どのように変更したかです。
 
少なくともあなたのシートの説明では変更後の列見出しは
5、6行目だろうと推測されるから、For j = 1 To 2の部分は
For j = 5 To 6に変更すべきだろうと思う。
そしてそれに伴ってv(i, 2 + j)もv(i, j - 2)に変更すべきかな。
ただ、現在のシートの例だけでは心許ない。
 
 

回答
投稿日時: 17/12/02 06:42:39
投稿者: simple

皆さんから適切なご指摘をいただいています。
 
現行と、書き出す項目の数も、順番も変わっているわけだが、
単なる説明漏れなんでしょうか? そこが大事なところなんですけどねえ。
(逆に、3列ごとを4列ごとにしても影響はありません)
 
要するに、今のコード内容が読めていない、ということです。
適切なコメントつけながら、内容を把握するのが先決です。
 
こうした掲示板を利用することも解決の一つの方法でしょうが、
危険なのは、手っ取り早く結果を得ることで満足してしまうことです。
ご自分で読み込み、コードを理解する努力をしない限り、超えることはできません。
このことを念頭に置いて頑張ってください。
 
私だったらこんな風に書くかなという一例を示しておきます。適当に修正してください。
 

Sub test()
    Dim sh As Worksheet
    Dim cm As Comment
    Dim v()
    Dim r As Range
    Dim k As Long, cnt As Long

    Set sh = ActiveSheet
    cnt = sh.Comments.Count
    If cnt = 0 Then Exit Sub

    ReDim v(1 To cnt, 1 To 4)
    For Each cm In sh.Comments
        Set r = cm.Parent                     'コメントのあるセル
        k = k + 1
        v(k, 1) = sh.Cells(5, r.Column).MergeArea(1).Value '日付
        v(k, 2) = sh.Cells(6, r.Column).Value '昼夜
        v(k, 3) = sh.Cells(r.Row, 1).Value    'その行のA列の値
        v(k, 4) = cm.Text                     'コメント内容
    Next

    '結果配列を新規シートに転記
    Worksheets.Add.Range("A1").Resize(cnt, 4).Value = v
End Sub

投稿日時: 17/12/03 23:07:45
投稿者: まさ77

こんばんは
お世話になっています。
 
コードの意味を理解するように努めていきたいと思います。
ご教授頂いたコードの意味を理解するように努めていき
勉強していきます。
お教え頂いたコードで無事問題解決しました。
ありがとうございます