Excel VBA質問箱 IV

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

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


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

【75844】Re:パターン別に集計したいです。
発言  kanabun  - 14/7/13(日) 11:56 -

引用なし
パスワード
   ▼初心者 さん:

>《イメージ》
>【Sheet1】                → パターン仕訳け
>-------------------------------------
>種別 1. 2. 3. パターン 対象外
>A   1       あ         →A の「あ」の行
>A   1       あ         →A の「あ」の行
>A     1     い         →A の 「い」の行
>B     1  1   う         →B の 「う」の行
>B     1          S     →B の「対象外」の行
>C       1             →C の「調査中」の行
'

Sub Try1()
  Dim i As Long, n As Long, m As Long
  Dim dic As Object '種別を調べるための箱を用意します。
  Set dic = CreateObject("Scripting.Dictionary")
  
  Dim r As Object
  Dim v
  Set r = Worksheets(1).[A1].CurrentRegion '表データを配列に入れる
  v = Intersect(r, r.Offset(1)).Value   '入れる(一行目は除く)

'(1) 種別の種類を調べる → A,B,C
  For i = 1 To UBound(v)
    If Not dic.Exists(v(i, 1)) Then
      n = n + 1
      dic(v(i, 1)) = n
    End If
  Next  '以上で 種別 A(1), B(2), C(3) が完成()内は行番号
  
'(2) パターンの種類を調べる → 「あ」,「い」,「う」
  Dim dic2 As Object
  Set dic2 = CreateObject("Scripting.Dictionary")
  m = 0
  For i = 1 To UBound(v)  '5列目を調べる
    If Not IsEmpty(v(i, 5)) Then
      If Not dic2.Exists(v(i, 5)) Then
        m = m + 1
        dic2(v(i, 5)) = m
      End If
    End If
  Next
' パターンとしてはこれ以外に「対象外」「調査中」を追加。
  Dim mout&, mcho&
  m = m + 1
  dic2("対象外") = m: mout = m
  m = m + 1
  dic2("調査中") = m: mcho = m
  
'(3) 以上が分ったら、
'  種別の数だけ大きい箱を用意する
'  箱の中に パターンの数だけの小さい箱を入れる
'  そのパターン用の小さい箱のなかは 1. | 2. | 3. の仕切りを入れる
  ReDim Ot(1 To n, 1 To m, 1 To 3)
'  ┌────────────────┐
'n=1│種別A パターン  1. 2. 3.   │
'  │   1 あ            │
'  │   2 い            │
'  │   3 う            │
'  │   4 対象外         │
'  │   5 調査中         │
'  └────────────────┘
  
'(4) もう一度Sheet1の表を上から順に読んでいって、データを仕分ける
  Dim j As Long, x As Long
  For i = 1 To UBound(v)
    n = dic(v(i, 1))
    If Not IsEmpty(v(i, 5)) Then
      m = dic2(v(i, 5))
    Else
      If v(i, 6) = "S" Then
        m = mout
      Else
        m = mcho
      End If
    End If
    '[1.][2.][3.]列の値1を調べる(あれば配列要素位置に加算)
    For j = 1 To 3
      x = j + 1
      If v(i, x) > 0 Then
        Ot(n, m, j) = Ot(n, m, j) + v(i, x)
      End If
    Next
  Next
  
'(5) Sheet2に 種別の数だけカード型データベースを発行する
  Sheet2.Select
  Sheet2.UsedRange.ClearContents
  Dim a, b, c
  Dim y As Long
  y = 1
  [A1:E1].Value = Split("種別 パターン 1. 2. 3.")
  For Each a In dic.Keys()
    y = y + 1
    Cells(y, 1).Value = a
    n = dic(a)
    For Each b In dic2.Keys()
      y = y + 1
      Cells(y, 2).Value = b
      m = dic2(b)
      For j = 1 To 3
        If Ot(n, m, j) > 0 Then
         Cells(y, j + 2).Value = Ot(n, m, j)
        End If
      Next
    Next
  Next
End Sub
・ツリー全体表示

【75843】Re:パターン別に集計したいです。
発言  kanabun  - 14/7/13(日) 10:49 -

引用なし
パスワード
   ▼初心者 さん:

>《やりたいこと》
> Sheet1のデータを、Sheet2に、データ種類別・パターン別に集計したい。
>※「パターン列=空白」&「対象外列=S」のときは、対象外として集計する。
>※「パターン列=空白」&「対象外列=空白」のときは、調査中として集計する。

《イメージ》
【Sheet1】                → パターン仕訳け
-------------------------------------
種別 1. 2. 3. パターン 対象外
A   1       あ         →A の「あ」の行
A   1       あ         →A の「あ」の行
A     1     い         →A の 「い」の行
B     1  1   う         →B の 「う」の行
B     1          S     →B の「対象外」の行
C       1             →C の「調査中」の行

(1) 種別の種類を調べる → A,B,C
(2) パターンの種類を調べる → 「あ」,「い」,「う」
       パターンとしてはこれ以外に「対象外」「調査中」を追加。

(3) 以上が分ったら、
  種別の数だけ大きい箱を用意する
  箱の中に パターンの数だけの小さい箱を入れる
  そのパターン用の小さい箱のなかは 1. | 2. | 3. の仕切りを入れる

(4) もう一度Sheet1の表を上から順に読んでいって、データを仕分ける
  たとえば、一行目データは種別A で パターンが「あ」のカードの
  「1.」の列に 1 と書きこむ。
  たとえばに行目のデータは一行目と同じ位置なので、カードAのその位置に
  1 を加算する。
  たとえば5行目データは種別Bのカードのパターン「対象外」なので
  「対象外」行の「2.」の列に1 を加える。

(5) Sheet2に 種別の数だけカード型データベースを発行する
┌────────────────┐
│種別A パターン  1. 2. 3.   │
│    あ            │
│    い            │
│    う            │
│   対象外          │
│   調査中          │
└────────────────┘
・ツリー全体表示

【75842】Re:パターン別に集計したいです。
発言  kanabun  - 14/7/13(日) 0:54 -

引用なし
パスワード
   別件ですが、
ピボットテーブルはお得意ですか?
・ツリー全体表示

【75841】Re:パターン別に集計したいです。
発言  kanabun  - 14/7/13(日) 0:48 -

引用なし
パスワード
   ▼初心者 さん:

>フローを書いて整理したのですが、VBAについてまったくの初心者で関数がわからず、コーディングも初めてですので、お恥ずかしいのですが、まずはサンプルコードを読んで理解するところから始めたいと思いました。

逆です。

>パターン別にデータ行単位で加算していきたいのですが、

「パターン別」→ これをもっと具体的に、あなたが手動でやるとき、
あるいは だれか配下の人に手順を教えるとき、
「ここをどうして... つぎに、これをなんたらして...」と説明すると
思います。
これを文章にしてみるのです。
具体的な手順が日本語で書けるようになる方が、コードを書くよりか
よほど難しいのです。

「ぐだぐだ言ってないで、コードをくれ!」

というのは、思考放棄です。
・ツリー全体表示

【75840】Re:パターン別に集計したいです。
発言  初心者  - 14/7/13(日) 0:33 -

引用なし
パスワード
   ▼kanabun さん:
>いきなりコードを書こうとしないで、
>処理内容を順に 日本語の「疑似コード」で書いてみたらどうですか?

早速のご連絡ありがとうございます。
ご指摘につきましてはおっしゃるとおりです。。。
フローを書いて整理したのですが、VBAについてまったくの初心者で関数がわからず、コーディングも初めてですので、お恥ずかしいのですが、まずはサンプルコードを読んで理解するところから始めたいと思いました。
パターン別にデータ行単位で加算していきたいのですが、その処理関数がわからず行き詰っています。
よろしくお願いいたします。
・ツリー全体表示

【75839】Re:パターン別に集計したいです。
発言  kanabun  - 14/7/13(日) 0:19 -

引用なし
パスワード
   ▼初心者 さん:


>大変恐れ入りますが当方初心者で勉強中のため、処理内容についてコメント補則いただけるとありがたいです。

いきなりコードを書こうとしないで、
処理内容を順に 日本語の「疑似コード」で書いてみたらどうですか?
・ツリー全体表示

【75838】パターン別に集計したいです。
質問  初心者  - 14/7/13(日) 0:10 -

引用なし
パスワード
   以下のとおりパターン別に集計するにはどのように処理を組めば良いかご教示願います。
大変恐れ入りますが当方初心者で勉強中のため、処理内容についてコメント補則いただけるとありがたいです。
よろしくお願いいたします。

《やりたいこと》
Sheet1のデータを、Sheet2に、データ種類別・パターン別に集計したい。
※「パターン列=空白」&「対象外列=S」のときは、対象外として集計する。
※「パターン列=空白」&「対象外列=空白」のときは、調査中として集計する。

《イメージ》
【Sheet1】
  1. 2. 3. パターン 対象外
A 1        あ
A 1        あ
A   1      い
B   1  1   う
B   1            S
C       1            (・・調査中)

【Sheet2(出力イメージ)】
      1. 2. 3.
A   
 あ    2
 い      1
 う
対象外
調査中
B   
 あ   
 い     
 う       1  1
対象外    1
調査中
C  
 あ   
 い      
 う
対象外
調査中      1

以上、よろしくお願いいたします。
・ツリー全体表示

【75837】Re:今日日付のセルを取得したいです
発言  γ  - 14/7/12(土) 13:16 -

引用なし
パスワード
   「質問箱基本ポリシー」から引用
> ●必ず返事をしてください
>  回答がついたら、その回答に必ず返事を書いてください。
>  それが最低限のエチケットというものです。
>  期待通りの回答があれば感謝の意を表すことはもちろん、
>  期待した回答ではない場合も必ず返事を書いてください。
>  どこがどう期待通りではないのかを具体的に書けば、
>  よりあなたの期待に近い回答が得られることでしょう。
ルールを守りましょうね。
・ツリー全体表示

【75836】Re:こんな集計できますか?
発言  γ  - 14/7/11(金) 20:56 -

引用なし
パスワード
   >「煮詰まる」「煮詰まった」の意味と誤用 〜「煮詰まった」は「行き詰まった」ではなかった!
>ht tp://www.kotobano.jp/archives/1277

知らなかった。
国語まで勉強できる掲示板だった・・・・。
・ツリー全体表示

【75835】Re:こんな集計できますか?
発言  国語適正化委員会  - 14/7/11(金) 20:50 -

引用なし
パスワード
   「煮詰まる」「煮詰まった」の意味と誤用 〜「煮詰まった」は「行き詰まった」ではなかった!
ht tp://www.kotobano.jp/archives/1277
・ツリー全体表示

【75834】Re:こんな集計できますか?
発言  γ  - 14/7/11(金) 20:49 -

引用なし
パスワード
   >    s = Cells(k, 2).Text & vbTab & Cells(k, 3)
訂正   s = Cells(k, 2).Text & vbTab & Cells(k, 3).Text
動くことは動きますが。
・ツリー全体表示

【75833】Re:こんな集計できますか?
回答  γ  - 14/7/11(金) 20:47 -

引用なし
パスワード
   ○○の一つ覚えで、dictionaryを使います。
書き込み場所とか、適当に修正してください。

Sub test()
  Dim dic As Object
  Dim k As Long
  Dim s As String
  Dim a
  Dim d

  Set dic = CreateObject("Scripting.Dictionary")

  ' 商品&tab&伝票をキーとした辞書に、数量を加算して集計する
  For k = 2 To Range("A1").End(xlDown).Row
    s = Cells(k, 2).Text & vbTab & Cells(k, 3)
    dic(s) = dic(s) + Cells(k, 1).Value
  Next

  '集計結果を5,6,7列に書き込みます。
  k = 1
  For Each d In dic
    k = k + 1
    a = Split(d, vbTab)
    Cells(k, 5).Value = dic(d)
    Cells(k, 6).Value = a(0)
    Cells(k, 7).Value = a(1)
  Next

  'あとはソートするだけ(マクロ記録で頑張ってください)

End Sub
・ツリー全体表示

【75832】Re:ブックの共有時のハイパーリンク使用2
発言  ゆーあ  - 14/7/11(金) 18:10 -

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

>ただし上記で開けるのはエクセルブックのみなので拡張子をチェックしてエクセルブックならば上記で、エクセルブック以外は
>WSH.Run """" & WK_Link & """", 3
>で開くようにする必要があります。
頑張ってみました!!

Dim ACR As Long
Dim WK_Link As String
Dim WSH
Dim XLApp As Excel.Application

  Worksheets("Sheet5").Activate
  ACR = ActiveCell.Row
  Cells(ACR, 6).Select
  ActiveCell.FormulaR1C1 = "=HYPERLINK(RC[-5],RC[-5])"
  
  WK_Link = Cells(ACR, 6).Value
  If Cells(ACR, 1) = "" Then
  Cells(ACR, 6).ClearContents
  Exit Sub
  End If
  If Right(WK_Link, 3) = "xls" Then
  Set XLApp = CreateObject("Excel.Application")
  XLApp.Workbooks.Open WK_Link
  XLApp.Visible = True
  Set XLApp = Nothing
  Else
  If Right(WK_Link, 3) = "pdf" Then
  Set WSH = CreateObject("Wscript.Shell")
  WSH.Run """" & WK_Link & """", 3
  Set WSH = Nothing
  End If
  End If
Worksheets("Sheet1").Select
・ツリー全体表示

【75831】こんな集計できますか?
質問  初心者(につまりました)  - 14/7/11(金) 17:54 -

引用なし
パスワード
   煮詰まって全く対応できません。

VBAでこのようなことが可能なのか教えてください。
可能であればそのVBAの式を記載御願いしたいのですが・・・

集計前シートに数量、商品、伝票NOの一覧表があります。
商品上1桁がCの商品のみ重複します。
この場合、伝票NOと商品Cが同じ場合は、その伝票NOの
最後行に商品Cを累計したもの表示して、累計前のものを
削除したいのですが・・・

印刷の順番は、商品A 商品B 商品Cの順で印刷を行いた


うまく説明できないので表を書いてみます。

1.は行数を表示
集計前)
1. 数量 商品  伝票 
2. 12    A1     KH6050
3. 12    B1     KH6050
4. 12    C1     KH6050
5. 3    A2     KH6050
6. 3    B2     KH6050
7. 3    C1     KH6050
8. 2    A3     KK6051
9. 2    B3     KK6051
10. 2    C1     KK6051
11. 2    A4     KK6051
12. 2    B4     KK6051
13. 2    C1     KK6051
14. 2    A5    KK6051
15. 2    B5    KK6051
16. 2    C1    KK6051
17. 2    A6    KK6051
18. 2    B6    KK6051
19. 2    C2    KK6051

1. 数量 商品  伝票 
2. 12    A1     KH6050
3. 12    B1     KH6050
4. 3    A2     KH6050
5. 3    B2     KH6050
6. 15    C1     KH6050
7. 2    A3     KK6051
8. 2    B3     KK6051
9. 2    A4     KK6051
10. 2    B4     KK6051
11. 2    A5    KK6051
12. 2    B5    KK6051
13. 2    A6    KK6051
14. 2    B6    KK6051
15. 6    C1    KK6051
16. 2    C2    KK6051

どなたか助けてください。
・ツリー全体表示

【75830】Re:ブックの共有時のハイパーリンク使用2
お礼  ゆーあ  - 14/7/11(金) 16:31 -

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

コメントありがとうございます。
実は、User Formがあったんですよ。
特に必要が無い情報かと勝手に判断してました。すみません。。。

>ユーザーフォームがあったんですね。
>このユーザーフォームはモーダルモードで開かれているのでしょうか?
>もしそうであればモードレスフォームで開くとどうなるでしょうか?
>(EXCELは開けても他に影響があるかもしれません)
すみません。。。
モーダルモード及びモードレスフォームという言葉自体知らないんです。
調べてみます。。。


>あと、ハイパーリンク先のEXCELはマクロを実行したEXCELで開かれる必要があるのでしょうか?
>新しいEXCELを開いてそちらで開いてもいいのであれば
>
>  Dim XLApp As Excel.Application
>
>  Set XLApp = CreateObject("Excel.Application")
>  XLApp.Workbooks.Open WK_Link
>  XLApp.Visible = True
>  Set XLApp = Nothing
>で開いてみてはどうでしょうか?
これも、私には意味がよく分かりません。すみません。。。
ですが、お教え頂いたコードを早速使わせて頂いたら、
イメージ通りの動作が確認できました!ありがとうございます!!


>ただし上記で開けるのはエクセルブックのみなので拡張子をチェックしてエクセルブックならば上記で、エクセルブック以外は
>WSH.Run """" & WK_Link & """", 3
>で開くようにする必要があります。
これも私には荷が重い感じです。
If文を使うのかな?くらいのレベルです。。。


PDFが開けないのは少し心残りですが、
ここまで希望の動作が出来ましたので、充分過ぎるほど満足してます。
本当にありがとうございます!!!大変感謝です!!!
もっと勉強します!!!
・ツリー全体表示

【75829】Re:ブックの共有時のハイパーリンク使用2
発言  独覚  - 14/7/11(金) 15:27 -

引用なし
パスワード
   ▼ゆーあ さん:
>お世話様です。
>HYPERLINK関数を使用し、xlsファイルを開く件ですが、
>お教え頂いた下記コードに、Unload UserForm2を追加すると、
>xlsファイルが開けることが確認出来ました。

ユーザーフォームがあったんですね。
このユーザーフォームはモーダルモードで開かれているのでしょうか?
もしそうであればモードレスフォームで開くとどうなるでしょうか?
(EXCELは開けても他に影響があるかもしれません)

あと、ハイパーリンク先のEXCELはマクロを実行したEXCELで開かれる必要があるのでしょうか?
新しいEXCELを開いてそちらで開いてもいいのであれば

  Dim XLApp As Excel.Application

  Set XLApp = CreateObject("Excel.Application")
  XLApp.Workbooks.Open WK_Link
  XLApp.Visible = True
  Set XLApp = Nothing
で開いてみてはどうでしょうか?
ただし上記で開けるのはエクセルブックのみなので拡張子をチェックしてエクセルブックならば上記で、エクセルブック以外は
WSH.Run """" & WK_Link & """", 3
で開くようにする必要があります。
・ツリー全体表示

【75828】Re:ブックの共有時のハイパーリンク使用2
発言  ゆーあ  - 14/7/11(金) 14:50 -

引用なし
パスワード
   お世話様です。
HYPERLINK関数を使用し、xlsファイルを開く件ですが、
お教え頂いた下記コードに、Unload UserForm2を追加すると、
xlsファイルが開けることが確認出来ました。

>Private Sub CommandButton6_Click()
>Dim ACR As Long
>Dim WK_Link As String
>Dim WSH
>  Worksheets("Sheet5").Activate
>  ACR = ActiveCell.Row
>  Cells(ACR, 6).Select
>  ActiveCell.FormulaR1C1 = "=HYPERLINK(RC[-3],RC[-3])"
>  
>  WK_Link = Cells(ACR, 6).Value
>  If Cells(ACR, 3) = "" Then
>  Cells(ACR, 3).ClearContents
>  Exit Sub
>  End If
>  Set WSH = CreateObject("Wscript.Shell")
>  WSH.Run """" & WK_Link & """", 3
>  Set WSH = Nothing
   Unload UserForm2  ←追加
>  Worksheets("Sheet1").Select
>End Sub

ですが、
出来ればUser Form2を消さず、また、
User Form2を表示させずに、開いたxlsファイルを
表示する方法は御座いますでしょうか?
(もとのファイルをマウスで選択しアクティブにすると、
画面上にUser Form2は表示されている)

現状、開いたxlsファイル画面上に、User Form2(& User Form1)が
表示されております。
これを消してしまうと、もとのファイルから、User Form1を呼び出し、
User Form1で検索をし、データ表示を行い、
User Form1上にある、User Form2を呼び出すコマンドボタンを押し・・・
っと、かなり手間が増えてしまいます。
どうか宜しくお願い致します。
・ツリー全体表示

【75827】Re:ユーザーフォームのTextBoxに計算過程を表示...
お礼  JI  - 14/7/11(金) 13:20 -

引用なし
パスワード
   ありがとうございました!
出来ました!

わからないまま 真似て いるだけではいけませんね。
根本的に勉強します
ありがとうございました。
・ツリー全体表示

【75826】Re:ユーザーフォームのTextBoxに計算過程を表示...
発言  kanabun  - 14/7/11(金) 12:49 -

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

>セル内には =1+1となています。
>
>それをそのまま ユーザーフォームのTextBoxに表示したいのですが無理でしょうか?

数値.Value = Worksheets("abc").Range("D" & i).Formula

ではいかが?

なお、数値のまえの Me は不要です。(エラーとかではないですが)
・ツリー全体表示

【75825】ユーザーフォームのTextBoxに計算過程を表示した...
質問  JI  - 14/7/11(金) 11:37 -

引用なし
パスワード
   初めての投稿です、いつも拝見して助かっております。

セルに =1+1 と入力すると 表示は2になりますが、
セル内には =1+1となています。

それをそのまま ユーザーフォームのTextBoxに表示したいのですが無理でしょうか?


Me.数値.Value = Worksheets("abc").Range("D" & i).Value

上記では 表示は2です。

Me.数値.Format =??  でなんとなかりますか?


また、TextBoxで編集し
=1+1と入力し登録します

.Cells(r, 4).Value = Me.数値.Value

上記でSheetsのセルには =1+1と なります。
これはこのままでいいのですが、


再び読み込むとTextBoxには 2 が表示され
登録するとSheetsセルは 2 になってしまい =1+1が消えてしまいます。


どうかご指導よろしくお願いいたします。
・ツリー全体表示

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