Excel VBA質問箱 IV

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

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


1 / 3754 ページ 前へ→

【80719】Re:データを横にペーストしていきたい
回答[NEW]  γ  - 19/4/21(日) 21:26 -

引用なし
パスワード
   配列を使ったコード例。(色々な書き方があるので一例として)

Sub test2()
  Dim lastRow As Long
  Dim mysize As Long
  Dim mat()  As Variant
  Dim v    As Variant
  Dim k    As Long
  Dim j    As Long
  Dim m    As Long
  Dim kk   As Long
  
  Dim t    '経過時間計測用
  t = Timer
  
  lastRow = Cells(Rows.Count, "A").End(xlUp).Row
  
  'できあがりの表の行数
  mysize = WorksheetFunction.Ceiling(lastRow / 3, 1)
  
  '結果一時保持用配列の大きさを宣言
  ReDim mat(1 To mysize, 1 To 9)
        
  '元データを配列vに取り込む
  v = Range("A1").CurrentRegion.Resize(mysize * 3, 3).Value

  For k = 1 To mysize * 3 Step 3
    kk = Int((k - 1) / 3) + 1
    For j = 1 To 3
      For m = 1 To 3
        mat(kk, (j - 1) * 3 + m) = v(k + j - 1, m)
      Next
    Next
  Next

  '纏めて書込む
  [E1].Resize(mysize, 9).Value = mat
  
  Debug.Print "配列利用 "; Timer - t
End Sub
・ツリー全体表示

【80718】Re:データを横にペーストしていきたい
お礼[NEW]  リョウ  - 19/4/21(日) 14:23 -

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

>いったん二次元配列に結果を書き込んでおいて、
>それを一回の処理でまとめてシートに書き込む方法です。
>トライしてみてください。
なるほど。
あとは自分で色々と調べてみます。


>もっとも数千行くらいのデータであれば今の方法で十分でしょう。
>数万〜数十万行のオーダーなら効果は大きいと思います。
あっても数百行くらいのデータですので、特に考慮する必要は無さそうということで理解しました。

早々にご返信いただきまして、本当にありがとうございました。
また機会ありましたら、宜しくお願いいたします。
・ツリー全体表示

【80717】Re:データを横にペーストしていきたい
回答[NEW]  γ  - 19/4/21(日) 14:10 -

引用なし
パスワード
   時間がかかるのは、シートへの書き込みです。
各セルにその都度書き込むとそれだけ時間が掛かりますから、
いったん二次元配列に結果を書き込んでおいて、
それを一回の処理でまとめてシートに書き込む方法です。
トライしてみてください。

もっとも数千行くらいのデータであれば今の方法で十分でしょう。
数万〜数十万行のオーダーなら効果は大きいと思います。
・ツリー全体表示

【80716】Re:データを横にペーストしていきたい
質問[NEW]  リョウ  - 19/4/21(日) 11:13 -

引用なし
パスワード
   ▼リョウ さん:

ご教授ありがとうございます。
希望通りの処理が行われることを確認しました。
また「Mod」の使い方も理解しました。

>大量にある場合は、配列を利用することになると思います。
度々で申し訳ございませんが、ここの文言がピンときていません。。
実際はもっとデータが多いのですが、宜しければもう少し具体的に教えていただけると助かります。

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

【80715】Re:データを横にペーストしていきたい
回答[NEW]  γ  - 19/4/21(日) 6:22 -

引用なし
パスワード
   色々な書き方があると思いますが、下記は基本的だろうと思います。
大量にある場合は、配列を利用することになると思います。

Sub test()
  Dim lastRow As Long
  Dim k    As Long
  Dim rng   As Range
  
  lastRow = Cells(Rows.Count, "A").End(xlUp).Row
  
  '最初の貼付先位置
  Set rng = Cells(1, 5)
  
  For k = 1 To lastRow
    'コピーペイスト
    Cells(k, 1).Resize(1, 3).Copy rng
    
    '次の貼付先位置を設定
    If k Mod 3 = 0 Then
      Set rng = rng.Offset(1, -6)
    Else
      Set rng = rng.Offset(0, 3)
    End If
  Next
End Sub
・ツリー全体表示

【80714】データを横にペーストしていきたい
質問[NEW]  リョウ E-MAIL  - 19/4/21(日) 1:29 -

引用なし
パスワード
   VBAの初心者です。
下記のコピー&ペーストを、For〜Nextのように繰り返して実行したいのですが、コードのイメージが涌かず質問させていただきます。


【質問内容】
・“A列〜C列”にデータがあるとして、そのデータをE列から横に繋げてペーストしてきたいです。

 1.“A1〜C1”をコピーして、“E1(〜G1)”にペースト。
 2.“A2〜C2”をコピーして、1.でペーストした1つの右の“H1(〜J1)”にペースト。
 3.“A列〜C列”のデータを3回ペーストしたら、次のデータは1つ下のE列の行からペーストしていく。
 4.これを“A列〜C列”にデータが入力されているところまで繰り返す。
  (=A列にデータが入力されているところまで)


図が分かりづらいかもしれませんが、どなたかご教授いただけないでしょうか。
もし過去に同様の質問があるようでしたら、お教えいただけると幸いです。

宜しくお願いいたします。

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

  A  B  C  D  E  F  G  H  I  J  K  L  M
1 A1 B1 C1    A1  B1  C1  A2  B2  C2  A3  B3  C3
2 A2 B2 C2    A4  B4  C4                     
3 A3 B3 C3                              
4 A4 B4 C4


  Range("A1:C1").Select
  Selection.Copy
  ActiveSheet.Paste Range("E1")
  
  Range("A2:C2").Select
  Selection.Copy
  ActiveSheet.Paste Range("H1")
  
  Range("A3:C3").Select
  Selection.Copy
  ActiveSheet.Paste Range("K1")

  '3回ペーストしたら、下の行にペーストしていく
  Range("A4:C4").Select
  Selection.Copy
  ActiveSheet.Paste Range("E2")
  
  Application.CutCopyMode = False
・ツリー全体表示

【80713】Re:行番号列の列幅取得方法
お礼  [名前なし]  - 19/4/20(土) 12:33 -

引用なし
パスワード
   ▼マナ さん:
>▼[名前なし] さん:
>
>>クラスモジュールでグラフのイベントを取得する方法は把握していましたが、
>>標準モジュールで完結する方法を求めていました。
>
>特定のグラフに限定してよいなら
>クラスモジュールでなくても、
>Thisworkbookやシートモジュールでよいです。
>
>クリックして取得するということはイベントだから
>標準モジュールだけで完結は不可能では?
>
>単に選択されている系列ということなら以下ではだめなのですか。
>ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=80696;id=excel
ご提案頂きありがとうございます。

現在はグラフにマクロを登録して、イベントを取得しています。
URLの通りに実行してみましたが、SelectionがRangeのままの為、動作しませんでした。

GetCursorPosで取得した座標を以下の式で変形して近似値が取れたので、
正しい解決法ではありませんが、これで解決とさせて頂きます。

Po.y = Po.y - ActiveWindow.PointsToScreenPixelsY(CommandBars("Formula Bar").Height)
Po.x = (Po.x - ChartObj.ShapeRange.Left) * 72 / 96

ご教示頂きまして誠にありがとうございました。
・ツリー全体表示

【80712】Re:別ブックの複数シートのセルから、別...
発言  マナ  - 19/4/19(金) 19:31 -

引用なし
パスワード
   ▼ちっちきち さん:


>同じセル位置(R90C10、R110C10)から「転記先のwb」のセル(A1、A2〜L1、L2)

R90C10 とか R110C10 はどこのセルでしょうか。
・ツリー全体表示

【80711】Re:行番号列の列幅取得方法
発言  マナ  - 19/4/19(金) 19:18 -

引用なし
パスワード
   ▼[名前なし] さん:

>クラスモジュールでグラフのイベントを取得する方法は把握していましたが、
>標準モジュールで完結する方法を求めていました。

特定のグラフに限定してよいなら
クラスモジュールでなくても、
Thisworkbookやシートモジュールでよいです。

クリックして取得するということはイベントだから
標準モジュールだけで完結は不可能では?

単に選択されている系列ということなら以下ではだめなのですか。
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=80696;id=excel
・ツリー全体表示

【80710】Re:行番号列の列幅取得方法
お礼  [名前なし]  - 19/4/19(金) 16:20 -

引用なし
パスワード
   ▼マナ さん:
>▼[名前なし] さん:
>
>MouseUpイベントで、x,y座標を取得しています。
>
>グラフのイベントについては、
>ichinoseさんの回答を参考にしてください。
>ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=8886;id=excel#8886

ご教示ありがとうございます。

クラスモジュールでグラフのイベントを取得する方法は把握していましたが、
標準モジュールで完結する方法を求めていました。

もし分かれば、行番号列/列番号行の取得が今後何らかの形で利用できればと思っていました。

クラスモジュールを使用しての方法しかなさそうなので、そちらを利用させて頂きます。

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

【80709】別ブックの複数シートのセルから、別ブッ...
質問  ちっちきち  - 19/4/19(金) 13:55 -

引用なし
パスワード
   VBA初心者です。
変数と定数の定義もあまりよくわからず、これからしっかり勉強していきたいので、よろしくお願いします。


「転記先のwb」を開いている状態です。

行いたい作業は、「このwb」の複数シート(各月でシートにわけています)の
同じセル位置(R90C10、R110C10)から「転記先のwb」のセル(A1、A2〜L1、L2)に転記することです。


「このwb」の名前が変わることがあり、いちいち変更するのが面倒なので
変数にしてしまおうと思いましたが、よくわかりません。


1月スタートではなく、6月スタートになっています。
このシート名も毎回指定するしかないですか?
シート名は「■月(支出)」の「■」の部分が6月始まりの5月終わりです。


「このwb」の複数シート(各月でシートにわけています)の
同じセル位置(R90C10、R110C10)も変わるかもしれないので
ここも変数に置き換えたいです。

※変えるときは全てのシートの位置を変えますので、(R●C▲、R●C▲)は常に一緒です。


以下、作ってみたのですが、
「オブジェクトは、このプロパティまたはメソッドをサポートしていません」とでます。


Sub 読込()


  Workbooks.Open Filename:= _
  "Y:\〇〇\××\△△\◇◇\このwb.xlsm" , UpdateLinks:=3
    
  Dim wb As Workbook
    Set wb = Workbooks("このwb.xlsm")
    
  Windows("転記先のwb.xlsm").Activate
  
  Range("A1").Select
  ActiveCell.FormulaR1C1 = wb.Sheets("6月(支出)").R90C10
  Range("A2").Select
  ActiveCell.FormulaR1C1 = wb.Sheets("6月(支出)").R110C10
 
  Range("B1").Select
  ActiveCell.FormulaR1C1 = wb.Sheets("7月(支出)").R90C10
  Range("B2").Select
  ActiveCell.FormulaR1C1 = wb.Sheets("7月(支出)").R110C10

  .
  .
  .
  .

  Range("L1").Select
  ActiveCell.FormulaR1C1 = wb.Sheets("5月(支出)").R90C10
  Range("L2").Select
  ActiveCell.FormulaR1C1 = wb.Sheets("5月(支出)").R110C10
    
  Windows("このwb").Activate
  ActiveWorkbook.Save
  ActiveWindow.Close
  

  MsgBox "転記が完了しました。"

End Sub


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

【80708】Re:For Next ついてお願いします
お礼  初心者  - 19/4/18(木) 9:04 -

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

ありがとうございます。
おっしゃる方法はわかった上で
Next forの方法を知りたくて
質問しました。

▼マナ さん:
>▼初心者 さん:
>>B8とC8をB9C9からB30C30まで貼り付けたいのですが
>>出来ずに困っています。
>
>もう見ていないかもしれませんが…
>
>手操作だと、1行ずつ何回も貼り付けを繰り返しませんよね。
>B9:C30を選択して1回で貼り付けると思います。
>
>マクロでも同じですよ。
>
>Sub test()
>
>  Range("B8:C8").Select
>  Selection.Copy
>  Range("B9:C30").Select
>  ActiveSheet.Paste
>  Application.CutCopyMode = False
>
>End Sub
>
>で、マクロだとセルを選択する必要はないので
>シンプルに、こんな記述にします。
>
>
>Sub test2()
>
>  Range("B8:C8").Copy Range("B9:C30")
>
>End Sub
・ツリー全体表示

【80707】Re:行番号列の列幅取得方法
発言  マナ  - 19/4/17(水) 22:12 -

引用なし
パスワード
   ▼[名前なし] さん:

MouseUpイベントで、x,y座標を取得しています。

グラフのイベントについては、
ichinoseさんの回答を参考にしてください。
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=8886;id=excel#8886
・ツリー全体表示

【80706】Re:For Next ついてお願いします
発言  マナ  - 19/4/17(水) 18:49 -

引用なし
パスワード
   ▼初心者 さん:
>B8とC8をB9C9からB30C30まで貼り付けたいのですが
>出来ずに困っています。

もう見ていないかもしれませんが…

手操作だと、1行ずつ何回も貼り付けを繰り返しませんよね。
B9:C30を選択して1回で貼り付けると思います。

マクロでも同じですよ。

Sub test()

  Range("B8:C8").Select
  Selection.Copy
  Range("B9:C30").Select
  ActiveSheet.Paste
  Application.CutCopyMode = False

End Sub

で、マクロだとセルを選択する必要はないので
シンプルに、こんな記述にします。


Sub test2()

  Range("B8:C8").Copy Range("B9:C30")

End Sub
・ツリー全体表示

【80705】Re:行番号列の列幅取得方法
発言  マナ  - 19/4/17(水) 18:27 -

引用なし
パスワード
   ▼[名前なし] さん:

>シート内の円グラフクリック時、マクロを使ってクリックした系列を取得しようとしています。
>
>GetChartElementで系列を取得しようとし、
>GetCursorPosでマウス位置を取得しましたが、判定位置にズレがありました。
>

これとは違うのですか?

ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=80696;id=excel

別の方法でもよければ、こんな感じでできませんか。

Private Sub myChart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
  Dim ElementID As Long
  Dim Arg1 As Long
  Dim Arg2 As Long

  myChart.GetChartElement x, y, ElementID, Arg1, Arg2

  If ElementID = xlSeries Then
    MsgBox myChart.SeriesCollection(Arg1).Name
  End If

End Sub
・ツリー全体表示

【80704】Re:For Next ついてお願いします
お礼  初心者  - 19/4/17(水) 14:02 -

引用なし
パスワード
   ありがとうございました
・ツリー全体表示

【80703】行番号列の列幅取得方法
質問  [名前なし]  - 19/4/17(水) 12:34 -

引用なし
パスワード
   シート内の円グラフクリック時、マクロを使ってクリックした系列を取得しようとしています。

GetChartElementで系列を取得しようとし、
GetCursorPosでマウス位置を取得しましたが、判定位置にズレがありました。

CommandBars("Formula Bar")の高さ分減らすことで縦軸は調整できたのですが、
横軸のズレが残ったままとなっています。

横軸のズレを治すために、行番号列(A列の左)の幅を取得したいのですが、
CommandBars("Column").Widthを42、45、84の3種で行っても正しい値が取れません。

どの様な方法で取得したらよいでしょうか?
標準モジュールを使用しています。
・ツリー全体表示

【80702】Re:For Next ついてお願いします
回答  [名前なし]  - 19/4/17(水) 12:22 -

引用なし
パスワード
   ▼初心者 さん:
>B8とC8をB9C9からB30C30まで貼り付けたいのですが
>出来ずに困っています。
>よろしくお願いします
>
>Sub Macro1()
>'
>'
>'Dim i As long
>
> For i = 9 To 30
>
>  Range("B8:C8").Select
>  Selection.Copy
>  Range("B9").Select
>  ActiveSheet.Paste
>  Application.CutCopyMode = False
>  
>  
>  Next
>  
>End Sub

>  Range("B9").Select

常にB9を選択しています。
下に進むには"B9"を"B"+CStr(i)に変更する必要があります。
・ツリー全体表示

【80701】For Next ついてお願いします
質問  初心者  - 19/4/17(水) 11:21 -

引用なし
パスワード
   B8とC8をB9C9からB30C30まで貼り付けたいのですが
出来ずに困っています。
よろしくお願いします

Sub Macro1()
'
'
'Dim i As long

For i = 9 To 30

  Range("B8:C8").Select
  Selection.Copy
  Range("B9").Select
  ActiveSheet.Paste
  Application.CutCopyMode = False
  
  
  Next
  
End Sub
・ツリー全体表示

【80700】Re:グラフのアクティブ線が何番目である...
お礼  TK  - 19/4/16(火) 9:52 -

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

ありがとうございます。
出来ました。

グラフの数式から持ってくるという発想全くありませんでしたので、
目から鱗でした。

因みに感謝の投稿には蛇足ですが
作成中のグラフが4要素からなるグラフだけでなく
複雑なグラフも混じっていたのですが、UBound()を用いることで達成できました。

本当にありがとうございます。
・ツリー全体表示

1 / 3754 ページ 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free