Excel VBA質問箱 IV

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

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


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

【78049】Re:別ファイルにあるセル範囲を配列に格...
発言  β  - 16/3/14(月) 9:30 -

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

おそらく、Sample2の方式(外部参照数式方式)をもとにトライされているんですかね?
数式で処理すようとすると、同じブックにあっても、左詰め、上詰めが必要で
数式エキスパートさんなら 超難解な数式を組み立て(もしかしたら配列数式)ることも可能かとも思いますが
βには、とっても無理です。
逆に、ayuさんが、同じブックに元シートがあるとすれば、ひっぱってくる数式を書くことができるなら
それを教えてください。
その数式を使ったコードをβが書くことはできますので。

むしろ、Sample方式、つまりブックを開いて、処理する方式が、エクセルの持つ優れた機能を
使うこともできますし、コードもわかりやすいと思います。

で、とりあえず Sample方式で、コードを書きますが、時間がなかなかとれないので
明日、あるいは明後日になるかもしれません。
・ツリー全体表示

【78048】Re:別ファイルにあるセル範囲を配列に格...
質問  ayu  - 16/3/14(月) 6:25 -

引用なし
パスワード
   ▼β さん:
お世話になります。この前教えて頂いた事を元にやりたい事を色々試しているのですが、詰まってしまいましたので、再度質問させて頂きます。
教えて頂いた事を基に、別シートから項目名と合計数を抽出し、転記先のシートに下記のようにするとこるまではできました。このように奇数行が項目名で、偶数行が該当項目の合計数になっています。項目数は一定しておらず下記に表示してるより多い行もあります。

    A列    B列   C列  D列   E列   F列   G列    H列
1行目 S-Trim  M-Trim  SC-S  SC-ML Under12 Point   N/A    
2行目 32    10    3    7   0    0     0    
3行目 C-Re/VS  C-S   C-M  C-Semi C-L   C-SLong  N/A    
4行目 0     1    0    0   0    0     0    
5行目 HL-Half  HL-Full  HL-Point   N/A               
6行目 0     0    0    0                
7行目 STP-Re  STP-S  STP-M STP-Semi STP-L STP-SLong STP-Bang N/A
8行目 0     0    0    0   0    0     0    0  
9行目 BL-Dry   TR   Iron  N/A                
10行目 0     0    0    0                
11行目 C-Eyeblow Beard  Iron  Rinse  Shampoo Bang   N/A  
12行目 0     0    0    0   0    3     0    
この下にも何行か続きます。

上記の表から印刷用のフォーマットに数字をコピーしたいのですが、そのフォーマットが
メニュー名|数|メニュー名|数|メニュー名|数|メニュー名|数|メニュー名|数
のようになっており、この行が9行ありまして、上記のメニューと合計セットも9つあります。
この印刷用のフォーマットに合計数が0以上のメニュー名と合計数をコピーしたいのですが、その方法が分からず詰まっています。

例えば上の例でいくと下記のように表示したいです。(合計数が0のメニューは無視)

    A列  B列  C列  D列 E列 F列 G列 H列
1行目 S-Trim  32  M-Trim 10  SC-S 3  SC-ML 7
2行目 C-S    1
3行目 Shampoo  3
4行目 Bang    3

このようにするべく色々模索しておりますが、なかなか上手くいきません。お時間のある時にでも何かヒントでも頂けたら大変ありがたいです。
何度もすみませんが、宜しくご教示お願いいたします。

>▼ayu さん:
>
>>左側で指定したセル範囲に右側のA2のFormulaをコピーし、
>>右側のセル範囲の値を左側で設定したシートのセル範囲にコピーする
>>ということであってますでしょうか?
>
>A2のFormula というのが、ちょっと変ですけど、以下のようなことです。
>
>たとえばステップ実行はご存じでしょうか。
>VBE画面で、Sample2 の任意のところをクリックしてF8 を押します。
>最初は Sub Sample2() が黄色くハイライトされます。
>で、そのまま F8 を押していきます。
>  shT.Range("A1:F2").Value = shT.Range("A1:F2").Value
>ここが黄色くなったら F8を押さず、マクロブックの "転記先のシート名" をみてください。
>この A1:F2 に、元ブックを参照する参照式が入っています。
>
>式と表示されている値を確認したら、VBE画面に戻り End Sub まで F8 を押していって下さい。
>
>Sample がうまくいったということですから、同じ環境(フォルダやブック名やシート名)で実行すれば
>シートに参照式がセットされ、そこで参照している値がシートに表示されているはずなんですが。
・ツリー全体表示

【78047】Re:マクロでグラフ作成
お礼  のりっぺ  - 16/3/13(日) 23:08 -

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

X軸 = "Sheet1!R9C1:R15C1" と X軸 = "Sheet1!A9:A15"
が同じものは理解が出来ました。数日前にマクロの本を買ったばかりで、
まずは少し読まないとだめですね〜

もう少し知識をつけたら再度質問させて頂きます。
・ツリー全体表示

【78046】Re:マクロでグラフ作成
発言  マナ  - 16/3/13(日) 22:45 -

引用なし
パスワード
   ▼のりっぺ さん:
まずはA1形式とR1C1形式について理解して下さい
ht tp://www.tschoolbank.com/excel/cell-reference-r1c1/

shn = "Sheet1"
SC = 9
LC = 15
X軸 = shn & "!R" & SC & "C1:R" & LC & "C1"



X軸 = "Sheet1!R9C1:R15C1"

となって、
これをA1形式にすると

X軸 = "Sheet1!A9:A15"

これが理解できないと、先に進めません。
・ツリー全体表示

【78045】Re:マクロでグラフ作成
質問  のりっぺ  - 16/3/13(日) 22:11 -

引用なし
パスワード
   マナさん!ホント初心者なのでスイマセン。

最初の記述で
With ActiveSheet.ChartObjects(1).Chart
   
 For i = 1 To 5 >>1.何が1から5なのか分かりません


 系列名 = shn & "!R6C" & i + 41 & ":R7C" & i + 41

>>これはシート1の6行したから41列目と7行したの41列目と言う事でしょうか?

 X軸 = shn & "!R" & SC & "C1:R" & LC & "C1"

>>2."!R"どこを指してるのか全く分かりません。"C1:R" "C1"もどこを指してるのか全く分かりません。
仮にA列に日付が入っている場合はその範囲を示すものなのでしょうか?

  Y軸 = shn & "!R" & SC & "C" & i + 41 & ":R" & LC & "C" & i + 41
>>3.これも41列目に入っている数値の範囲を示していると思いますが、
全く分かりません。
      
 系列番号 = i
>>4.41列目の数値が 1 2 3 4 5 と言う事でしょうか?

余りにも無知で申し訳ございません。
・ツリー全体表示

【78044】Re:マクロでグラフ作成
発言  マナ  - 16/3/13(日) 20:28 -

引用なし
パスワード
   ▼のりっぺ さん:
ちょっと書き換えてみました。
(理解しやすいようにしたつもり)

Sub test()
  Dim shn As String
  Dim SC As Long, LC As Long
  Dim i As Long
  Dim 系列名 As String, X軸 As String, Y軸 As String, 系列番号 As Long
  Dim 式 As String
   
  shn = "Sheet1"
  
  SC = 9
  LC = 15

  With ActiveSheet.ChartObjects(1).Chart
    For i = 1 To 5
      系列名 = shn & "!R6C" & i + 41 & ":R7C" & i + 41
      X軸 = shn & "!R" & SC & "C1:R" & LC & "C1"
      Y軸 = shn & "!R" & SC & "C" & i + 41 & ":R" & LC & "C" & i + 41
      系列番号 = i
      式 = "=SERIES(" & 系列名 & "," & X軸 & "," & Y軸 & "," & 系列番号 & ")"
      
      .SeriesCollection(i).FormulaR1C1 = 式
    Next
  End With

End Sub

でも、わたしの場合、Formulaプロパティより
XValuesやValuesプロパティを使うほうが、わかりやすいです。
こんな書き方もあるという参考まで。


Sub test2()
  Dim ws As Worksheet
  Dim SC As Long, LC As Long
  Dim X軸 As Range
  Dim i As Long
   
  Set ws = Worksheets("Sheet1")
  
  SC = 9
  LC = 15
  
  Set X軸 = ws.Range("A" & SC & ":" & "A" & LC)

  With ActiveSheet.ChartObjects(1).Chart
    For i = 1 To 5
      With .SeriesCollection(i)
        .XValues = X軸
        .Values = X軸.Offset(, i + 40)
      End With
    Next
  End With

End Sub
・ツリー全体表示

【78043】Re:マクロでグラフ作成
お礼  のりっぺ  - 16/3/13(日) 19:25 -

引用なし
パスワード
   ありがとうございます。
材料をそろえて頂いたので、
自分で学習しながら頑張ります。
・ツリー全体表示

【78042】Re:マクロでグラフ作成
発言  γ  - 16/3/13(日) 19:03 -

引用なし
パスワード
   3つじゃなく4つでした。
系列順序ですね、最後は。
提示した情報で読み解けるはずです。
・ツリー全体表示

【78041】Re:マクロでグラフ作成
お礼  のりっぺ  - 16/3/13(日) 18:27 -

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

この記述でまず仕組みを理解してから修正してみようと思います。
ありがとうございました。

頼んだのは現役を退職された方で副収入でやってるみたいです。
・ツリー全体表示

【78040】Re:マクロでグラフ作成
発言  γ  - 16/3/13(日) 12:07 -

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

  '作画
  Dim s As String
  
  With ActiveSheet.ChartObjects(1).Chart
    For i = 1 To .SeriesCollection.Count
      s = "=SERIES(" & sheet & "!R6C" & i + 41 & ":R7C" & i + 41 & "," _
              & sheet & "!R" & SC & "C1:R" & LC & "C1," _
              & sheet & "!R" & SC & "C" & i + 41 & ":R" & LC & "C" & i + 41 & "," _
              & i & ")"
      Debug.Print s
      .SeriesCollection(i).Formula = s
    Next i
  End With
 
  などとして、内容を確認して下さい。

  SERIESに与える3つの要素は、それぞれ
  ・凡例項目、
  ・横軸ラベル、
  ・グラフ値
  です。
 
  すでにある折れ線グラフの系列を一つ選択して、
  数式のところに現れる文字列をよく観察して、
  それぞれが何を示すか理解することが先決です。

余談:
会社でマクロ作成を依頼するルートがあるんですね?
そういう商売が普及しているのか。知らなかった。
これからは、ここでも幾ばくか払ってもらえないかな。www
・ツリー全体表示

【78039】Re:マクロでグラフ作成
発言  のりっぺ  - 16/3/13(日) 9:43 -

引用なし
パスワード
   ▼γ さん:
>こんにちは。
>
>そのコードはどこから持ってきたものですか?
>その説明をしてください。
>SheetとかLCとかSCとかはどのように設定されたもの?
>そういうセル範囲を指定しているんでしょう、としか言えない。
>
>あなたの目的(数値がどこに配置されていて、どのような種類のグラフを
>書こうとしているのか)を説明するのが先決でしょう。
>そして、マクロ記録をしてみるのが、最上の方法でしょう。


>>返答ありがとうございます。
コードは作成依頼したものです。
それを参考に自分でアレンジしたかったのですが、
依頼すると有料ですので・・・

説明不足でしたね申し訳ございません。
5つの項目について指定期間の折れ線グラフを作成するものです。

グラフに関する記述はシートの5つの列の指定範囲のグラフを表して
居るものだと思いますが私には分かりません。

以下の範囲で説明が出来るようでありましたらお願い致します。

'グラフ作成

  Dim i As Long, SC As Long, LC As Long, CL As Long
  SC = StartCell
  LC = LastCell
  
    
  '作画
 
   With ActiveSheet.ChartObjects(1).Chart
    For i = 1 To .SeriesCollection.Count
    .SeriesCollection(i).Formula = _
    "=SERIES(" & sheet & "!R6C" & i + 41 & ":R7C" & i + 41 & "," & sheet & "!R" & SC & "C1:R" & LC & "C1," & sheet & "!R" & SC & "C" & i + 41 & ":R" & LC & "C" & i + 41 & "," & i & ")"
    Next i
  End With
End Sub
・ツリー全体表示

【78038】Re:マクロでグラフ作成
発言  γ  - 16/3/13(日) 7:21 -

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

そのコードはどこから持ってきたものですか?
その説明をしてください。
SheetとかLCとかSCとかはどのように設定されたもの?
そういうセル範囲を指定しているんでしょう、としか言えない。

あなたの目的(数値がどこに配置されていて、どのような種類のグラフを
書こうとしているのか)を説明するのが先決でしょう。
そして、マクロ記録をしてみるのが、最上の方法でしょう。
・ツリー全体表示

【78037】マクロでグラフ作成
発言  のりっぺ  - 16/3/12(土) 22:56 -

引用なし
パスワード
   マクロ初心者です。
マクロで任意の日付間のグラフを作成したいのですが、参考にしている記述で分からない所が有ります。
私には理解不能なので、分かりやすく説明して頂けると助かります。
よろしくお願い致します。

'作画
 
   With ActiveSheet.ChartObjects(1).Chart
    For i = 1 To .SeriesCollection.Count
    .SeriesCollection(i).Formula = _
    "=SERIES(" & sheet & "!R6C" & i + 41 & ":R7C" & i + 41 & "," & sheet & "!R" & SC & "C1:R" & LC & "C1," & sheet & "!R" & SC & "C" & i + 41 & ":R" & LC & "C" & i + 41 & "," & i & ")"
    Next i
  End With
End Sub
・ツリー全体表示

【78036】Re:VLOOKUP関数の検索値を変数にする方法
お礼  真田● E-MAIL  - 16/3/9(水) 18:54 -

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

ありがとうございます。

今夜、確認してみます。
・ツリー全体表示

【78035】Re:VLOOKUP関数の検索値を変数にする方法
発言  ichinose  - 16/3/9(水) 6:59 -

引用なし
パスワード
   ▼真田● さん:
>▼β さん:
>MATCH関数というのがあるのですか
>奥が深いですね
>後で、調べてみます。
>
>別ファイルをRangeで指定する場合は、下の書き方で正解なのでしょうか?
>
>Range("[商品コード.xlsx]Sheet1!A$1:B$394"),
標準モジュールでは、使用頻度は低いですが間違いではありません。

シートモジュールでは、エラーに成ります。

どこでも通用させるには


Application.Range("[商品コード.xlsx]Sheet1!A$1:B$394")
こんな記述です。


βさんの記述が一般的ですけど・・・。
・ツリー全体表示

【78034】Re:VLOOKUP関数の検索値を変数にする方法
発言  β  - 16/3/8(火) 19:26 -

引用なし
パスワード
   ▼真田● さん:

Workbooks("商品コード.xlsx").Sheets("Sheet1").Range("A1:B394")

といった記述をします。
(ブックが開かれているという前提です)
・ツリー全体表示

【78033】Re:VLOOKUP関数の検索値を変数にする方法
質問  真田● E-MAIL  - 16/3/8(火) 17:41 -

引用なし
パスワード
   ▼β さん:
MATCH関数というのがあるのですか
奥が深いですね
後で、調べてみます。

別ファイルをRangeで指定する場合は、下の書き方で正解なのでしょうか?

Range("[商品コード.xlsx]Sheet1!A$1:B$394"),
・ツリー全体表示

【78032】Re:VLOOKUP関数の検索値を変数にする方法
発言  β  - 16/3/8(火) 11:25 -

引用なし
パスワード
   ▼真田● さん:

>VBAではVLOOLUPは使わない方が良いと言ってる人がおいようですが

想像ですけど、たぶん

結果1 =Application.VLOOKUP(検索文字列,検索領域,2,FALSE)
結果2 =Application.VLOOKUP(検索文字列,検索領域,3,FALSE)
結果3 =Application.VLOOKUP(検索文字列,検索領域,5,FALSE)

といったようなコード。
同じ検索文字列ですね。VLOOKUPは検索領域に、その検索文字列があるかどうかを
チェックしますよね。
そうすると、↑の3つのコード、同じ検索を3回行っていることになります。
取り出すものがかわるだけですよね。

こういったときには VLOOKUP を使わず、MATCH で検索し、ヒットすれば
その行の該当の列の値を取得するほうが、処理効率はいいですよね。

そういうことを言っているのだと思います。

それと、

>この数式に問題があるでしょうか?

まず、検索領域って、別ブックだったのですか?
いずれにしても、その検索領域の記述は間違っています。
アップされたコードのそれは【セルの数式】での記述スタイルですね。
VBAで使う場合は、VBAとしての記述(Rangeオブジェクトを使って記述)することが
必要です。

それと、検索文字列の商分コードですけど、検索したあとセット?
検索前にセットして検索することが必要ですよ。
・ツリー全体表示

【78031】Re:フッタのフォントサイズを取得するには
お礼  ふるった  - 16/3/8(火) 11:07 -

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

ありがとうございました!
教えて頂いた方法で対応します。
助かりました。
・ツリー全体表示

【78030】Re:フッタのフォントサイズを取得するには
発言  独覚  - 16/3/8(火) 10:51 -

引用なし
パスワード
   ▼ふるった さん:
単純に左側のフッターにシート名表示でフォントサイズを変えてある場合です。

&10&A
となっている場合。

Sub test()
  Dim a  As Integer
  
  a = Replace(Replace(Worksheets("Sheet1").PageSetup.LeftFooter, "&A", ""), "&", "")
  MsgBox a
End Sub

他の設定も行っている、などがあればそれも考慮してVBAを組み立てることになります。
・ツリー全体表示

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