Excel VBA質問箱 IV

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

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


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

【80975】Re:ピボットから.GetDataで総計を取る際
質問  とうもろこし  - 19/6/27(木) 19:20 -

引用なし
パスワード
   ▼マナ さん:
>▼とうもろこし さん:
>
>ht tp://officetanaka.net/excel/vba/tips/tips186.htm

早速のご返信ありがとうございます。
まさにそのページを見ながら作業していたのですが、解決できずでした…
申し訳ないのですが、具体的な修正ポイントをご指摘いただけますと大変助かります。
・ツリー全体表示

【80974】Re:ピボットから.GetDataで総計を取る際
発言  マナ  - 19/6/27(木) 19:02 -

引用なし
パスワード
   ▼とうもろこし さん:

ht tp://officetanaka.net/excel/vba/tips/tips186.htm
・ツリー全体表示

【80973】ピボットから.GetDataで総計を取る際
質問  とうもろこし  - 19/6/27(木) 18:47 -

引用なし
パスワード
   みなさま、こんにちは。
最近VBAを触り始めて、業務効率化のために日々勉強しております。

表題の件について質問をさせてください。
今、会社ごとの売上をまとめたピボットから、VBAで会社ごとの総計を取り出すという
コードを書こうとしているのですが、うまく実行されず困っております。

ピボットは20社程度の月ごとの売り上げをまとめており、
今回取り出したいのは会社ごとの総計売上となります。
一旦、以下のように記述しました。

Dim 総計 As Double
Dim 会社名 As String
Dim i As Long

  With ActiveSheet.PivotTables(1)
    For i = 1 To .PivotFields("対象企業").PivotItems.Count
    会社名 = .PivotFields("対象企業").PivotItems(i)
    総計 = .GetData(会社名)
    Next i
  End With

そうすると以下のようなエラーメッセージが出現しました。
実行時エラー '1004':
アイテム名が曖昧です。ピボットテーブル レポートのほかのフィールドに、同じ名前のアイテムが有る可能性があります。

構文"フィールド[アイテム]"を使用してください。例えば、アイテムが"オレンジ"でフィールドが"生産物"の場合、"生産物[オレンジ]にします。"

そこで、上記エラーを受けて、以下のように修正しました。

Dim 総計 As Double
Dim 会社名 As String
Dim i As Long

  With ActiveSheet.PivotTables(1)
    For i = 1 To .PivotFields("対象企業").PivotItems.Count
    会社名 = .PivotFields("対象企業").PivotItems(i)
    総計 = .GetData("対象企業[会社名]")
    Next i
  End With

しかし、今後はアイテム名が見つかりません。というエラーが出てうまく実行されずにいます。
どこか初歩的なところで間違えているのか、エラーメッセージで各種検索をかけてもうまく解決できなかったので、お手数ですが解決策をご存知でしたらご教示ください。

何卒宜しくお願いします。
・ツリー全体表示

【80972】Re:2回に1回エラーが出る
発言  よろずや  - 19/6/27(木) 16:54 -

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

>  a = Selection.Rows.Count

この文の意味を誤解してるのではないでしょうか?

誤:a と Selection.Rows.Count は同じと定義する。

正:この時点の Selection.Rows.Count の値を a に代入する。
・ツリー全体表示

【80971】Re:2回に1回エラーが出る
発言  よろずや  - 19/6/27(木) 14:22 -

引用なし
パスワード
   提示されたものの無駄を省くと、以下の様になります。

Option Explicit
Sub 当月入力準備()
  Dim a As Long, b As Long
  Application.ScreenUpdating = False
  With Sheets("7月").Range("B2")   
    With .CurrentRegion
      a = .Rows.Count
      b = .Columns.Count
    End With
    .Offset(2, 1).Resize(a - 3, b - 1).Copy
    .Offset(3, 1).Resize(a - 3, b - 1).PasteSpecial xlPasteValues
    .Offset(2, 1).Resize(a - 6, b - 1).ClearContents
  End With
End Sub

マクロの記録では、Select Selection がやたら出てきますが、
これらは、基本的には不要です。

処理としてこれで正しいのかどうかは、シートの構成が判りませんので、不明です。
・ツリー全体表示

【80970】Re:複数シートデータを一つのシートに1行...
お礼  カピ  - 19/6/27(木) 13:21 -

引用なし
パスワード
   ▼マナ さん:
アドバイスありがとうございました。
・ツリー全体表示

【80968】Re:選択セルのみ変更して繰り返す
発言  ピンク  - 19/6/26(水) 21:24 -

引用なし
パスワード
   ▼KH さん:
>   For Each c In Range("C7,D13,F20,G31")
         In .Range("C7,D13,F20,G31")

Rangeの前に入れてください。
・ツリー全体表示

【80967】Re:選択セルのみ変更して繰り返す
質問  KH  - 19/6/26(水) 20:43 -

引用なし
パスワード
   ▼ピンク さん:

ありがとうございました!
うまくいきました。
追加で質問なのですが、教えてもらったコードに
with構文を入れてcの前に「.」を追加したのですが、エラーが出ました。
このコードはおかしいでしょうか?


Sub Test()
  with sheets("A")
   Dim c As Range
   For Each c In Range("C7,D13,F20,G31")
     .c.Offset(2).Value = c.Offset(2, 1).Value
   Next
  end with
End Sub
・ツリー全体表示

【80966】Re:複数シートデータを一つのシートに1行...
発言  マナ  - 19/6/26(水) 19:03 -

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

説明の方法として、文章だけではわかりにくいので
下記のように、表形式で提示いただけるとよいです。

   -A-   -B-   -C-   -D-
1 受付番号 一人部屋 二人部屋 三人部屋 
2
3
4

それと、ここはExcel VBA(マクロ)の質問掲示板です。
数式については、他で質問されるとよいと思います。
・ツリー全体表示

【80965】複数シートデータを一つのシートに1行に...
質問  カピ  - 19/6/26(水) 15:01 -

引用なし
パスワード
   こんにちは。
シート<S1>と<台帳>があります。

<S1>,<S2>,<S3>,...と<S10>までそれぞれ上記のデータが入っています。

シート<S1>
A1に受付番号
B1に1

A3に一人部屋
A4に2

B3に二人部屋
B4に4

C3に三人部屋
C4に1

シート<S2>
A1に受付番号
B1に2

A3に一人部屋
A4に1

B3に二人部屋
B4に3

C3に三人部屋
C4に0

--------------------------------

シート<台帳>
A1に受付番号、B1に一人部屋、C1に二人部屋、D1に三人部屋
A2に1
A3に2

とあります。

A2に1, B2に2、C2に4、D2に1
A3に2, B3に1、C3に3、D3に0

というように転記しようとVLOOKUPやINDIRECTを考えましたが、
上手く行かず困っています。どなたかお力添えをお願いいたします。

お手数ですがよろしくお願い致します。
・ツリー全体表示

【80964】Re:vbaの行の取得について
お礼  名無しの権兵衛  - 19/6/26(水) 14:51 -

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

色々調べたところ、thiscellで実装できました。
・ツリー全体表示

【80963】Re:2回に1回エラーが出る
発言  さと  - 19/6/26(水) 12:32 -

引用なし
パスワード
   ▼γ さん:
これが現在のコードで、このように変数の宣言の位置を変えたら、何回も連続で処理を行ってもエラーが全く出なくなりました。

Option Explicit

Sub 当月入力準備()
  Application.ScreenUpdating = False
  With Sheets("7月")
   
   .Range("B2").CurrentRegion.Offset(2, 1).Select

  Dim a As Long, b As Long
  a = Selection.Rows.Count
  b = Selection.Columns.Count

    Selection.Resize(a - 3, b - 1).Select
    Selection.Copy
    .Range("B2").CurrentRegion.Offset(3, 1).Select
    Selection.Resize(a - 3, b - 1).Select
    Selection.PasteSpecial xlPasteValues
    .Range("B2").CurrentRegion.Offset(2, 1).Select
    Selection.Resize(a - 6, b - 1).Select
    Selection.ClearContents
  End With
End Sub
・ツリー全体表示

【80962】Re:vbaの行の取得について
回答  名無しの権兵衛  - 19/6/26(水) 10:07 -

引用なし
パスワード
      -A-   -B-
1   大    func(A1) 
2   中    func(A2) 
3   小    1 
4   小    2 
5   中    func(A5)     
6   小    3 
7   大    func(A7) 

B1はB2B5の合計
B2はB3B4の合計
B5はB6の値
となるように実装したいです。
・ツリー全体表示

【80961】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 22:09 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

こんな感じでしょうか。


Function func(集計項目 As Range) As Double
  Dim f As Range
  Dim r As Range
  Dim c As Range
  
  Application.Volatile
  
  With Range(集計項目, 集計項目.End(xlDown))
    Set f = .Find(集計項目.Value, 集計項目, , xlWhole)
    If f.Row = 集計項目.Row Then
       Set r = Range(集計項目.Offset(1), .Cells(.Count))
    Else
      Set r = Range(集計項目.Offset(1), f.Offset(-1))
    End If
  End With
    
  For Each c In r.Offset(, Application.Caller.Column - 集計項目.Column)
    If Not c.HasFormula Then
      func = func + c.Value
    End If
  Next

End Function

でも、func2がよいと思います。

Function func2(集計項目 As Range, データ範囲 As Range, 列番号 As Long) As Double
  Dim f As Range
  Dim r As Range
  Dim c As Range
  
  With データ範囲.Columns(1).Cells
    Set f = .Find(集計項目.Value, 集計項目, , xlWhole)
    If f.Row <= 集計項目.Row Then
       Set r = Range(集計項目.Offset(1), .Cells(.Count))
    Else
      Set r = Range(集計項目.Offset(1), f.Offset(-1))
    End If
  End With
  
  For Each c In r.Columns(列番号).Cells
    If Not c.HasFormula Then
      func2 = func2 + c.Value
    End If
  Next

End Function
・ツリー全体表示

【80960】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 19:07 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

何をしたいは理解しました。
でも、それが、なぜ最初の質問につながるのか理解できません。
・ツリー全体表示

【80959】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 18:55 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

よくわかりません。
どのセルに何が入力されているか
どのセルが数式で、そんな結果を期待しているか
説明してください。

   -A-   -B-
1        
2        
3        
4        
5        
5        
6        
7        
8
・ツリー全体表示

【80958】Re:vbaの行の取得について
発言  名無しの権兵衛  - 19/6/25(火) 18:32 -

引用なし
パスワード
   funcに項目の種類を渡して
自分の一つ下の項目の種類の合計を求めたいです。
上の中項目 5
2個目の中項目 1
大項目   6
となるように求めたいです。
_____________________
大項目 | func(A1)
中項目 | func(A2)
小項目 | 3
小項目 | 2
中項目 | func(A5)
小項目 | 1
大項目 | func(A7)
中項目 | func(A8)
小項目 | 1
_____________________
・ツリー全体表示

【80957】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 17:50 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

どんな関数か、もう少し具体的な例にできませんか。

Application.Callerでできると思いますが
引数に行を指定すればよいだけのような気がします。
・ツリー全体表示

【80956】vbaの行の取得について
質問  名無しの権兵衛  - 19/6/25(火) 17:16 -

引用なし
パスワード
   例   A1でユーザ定義関数を使ったら1-5行目
     A2でユーザ定義関数を使ったら2-6行目
でループしたいのですが、どのように求めたら良いのでしょうか?
・ツリー全体表示

【80955】Re:選択セルのみ変更して繰り返す
発言  ピンク  - 19/6/25(火) 16:52 -

引用なし
パスワード
   ▼KH さん:
>これの"C7"を"D13","F20","G31"など任意のものに変更して同じ処理をしたいです。
Sub Test()
  Dim c As Range
  For Each c In Range("C7,D13,F20,G31")
    c.Offset(2).Value = c.Offset(2, 1).Value
  Next
End Sub
・ツリー全体表示

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