Excel VBA質問箱 IV

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

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


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

【78588】Re:追加です。
発言  マナ  - 16/11/19(土) 8:52 -

引用なし
パスワード
   ▼しゅん さん:
>追加です。
>イメージとしては、コンボボックスで名前を選択し、その人が買った商品(商品はC1からAK1までずらっと並んでいます。)に1をつけて集計するといったかんじです。

こちらで続けてください

【78577】コンボボックスを使った行選択
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=78577;id=excel
・ツリー全体表示

【78587】Re:追加です。
発言  とおりすがり  - 16/11/18(金) 19:14 -

引用なし
パスワード
   ??
・ツリー全体表示

【78586】Re:大容量Dataのシート間のコピーについて
発言  β  - 16/11/18(金) 19:03 -

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

こちらで45000行16列、各セル 16文字 のデータを作成し以下のコードを走らせると、
こちらの環境で 3秒弱です。
なので、ステータスバーの表示をするまでもないと思います。(コードではしていません)
DoEventsも不要です。

ただ、出来上がりのブックは10メガほどになりますね。
これって、ブックそのものの扱いが重そうですね。

Sub Test()
  Dim t As Double
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Dim fV As Variant
  Dim tV() As String
  Dim i As Long
  Dim y As Long
  Dim x As Long
  Dim j As Long
  Dim z As Long
  Dim flg As Boolean
  
  t = Timer
  
  Set ws1 = Sheets("Sheet1")
  Set ws2 = Sheets("Sheet2")
  
  fV = ws1.Range("A1", ws1.Range("A" & Rows.Count).End(xlUp)).Resize(, 16).Value
  ReDim tV(1 To UBound(fV, 1), 1 To 16 * 3)
  
  For i = 1 To UBound(fV, 1) Step 3
    x = 0
    z = z + 1
    For y = i To i + 2
      If y > UBound(fV, 1) Then
        flg = True
        Exit For
      Else
        For j = 1 To UBound(fV, 2)
          x = x + 1
          tV(z, x) = fV(y, j)
        Next
      End If
    Next
    If flg Then Exit For
  Next
        
  ws2.Range("A1").Resize(z, UBound(tV, 2)).Value = tV
  
  MsgBox Timer - t
  
End Sub
・ツリー全体表示

【78585】Re:大容量Dataのシート間のコピーについて
回答  亀マスター  - 16/11/18(金) 17:14 -

引用なし
パスワード
   実はセルのデータを読み込んだり書き込んだりというのは結構負荷がかかるものであり、このように大量のセルをひとつひとつ操作していると時間がかかります。
そこで、セルの読み書き回数を減らすために、セル範囲をバリアント型の変数に読み込んで操作し、最後にセルに戻すというのが常套手段です。

具体的には、

Dim v1 As Variant, v2 As Variant

v1 = Range("A1:P45000")
v2 = Range("A1:AV15000")

'v1、v2を配列と見なして操作
'例)v2(1, 5) = v1(2, 3)

Range("A1:AV15000") = v2
Range("A15001:P45000").Clear

これならセルを操作するのが4回だけなので、かなり高速化できると思います。
・ツリー全体表示

【78584】追加です。
質問  しゅん  - 16/11/18(金) 14:14 -

引用なし
パスワード
   追加です。
イメージとしては、コンボボックスで名前を選択し、その人が買った商品(商品はC1からAK1までずらっと並んでいます。)に1をつけて集計するといったかんじです。
・ツリー全体表示

【78583】Re:コンボボックスを使った行選択
質問  しゅん  - 16/11/18(金) 14:04 -

引用なし
パスワード
   β さん お返事ありがとうございます。
まなさんから教えていただいた方法で、
コンボボックスから選択したものにシート上でセルを選択することができました。

もう一つなのですが、この選択したセルにチェックボックスでチェックを付けると"1"がついていくというようにしたいのですが、どうすればよいでしょうか?
お願いします。
・ツリー全体表示

【78582】Re:コンボボックスを使った行選択
質問  しゅん  - 16/11/18(金) 14:02 -

引用なし
パスワード
   マナ さん お返事ありがとうございます。
コンボボックスから選択したものにシート上でセルを選択することができました。
もう一つなのですが、この選択したセルにチェックボックスでチェックを付けると"1"がついていくというようにしたいのですが、どうすればよいでしょうか?
お願いします。
・ツリー全体表示

【78581】大容量Dataのシート間のコピーについて
質問  VBA初心者  - 16/11/18(金) 10:42 -

引用なし
パスワード
   初めまして、自分の仕事でどうしても大容量のDataのコピーをしたいのですが
処理に非常に時間(1時間程度)がかかってしまい、困っております。
現実的にこれぐらいのData量を処理するのにどれくらいで出来るかのがわかっていないので的違い質問だったらすみません。

まだ、VBAを始めたばかりで、アドバイス頂けると助かります。

それでは、よろしくお願いします。


○やりたいこと
コピー元(Sheet1)が、45000行で16列の16進数があり、
それをコピー先(Sheet2)には3行ずつを1行に纏めて、15000行で48列という形に
変更したいのです。

○自分が作ったソース

Sub Macro1()
'
' Macro1 Macro
'


Dim t As Single
Dim m(800000) As String
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")

t = Timer
'
' Prevents screen refreshing
  Application.ScreenUpdating = False
' Prevents auto recalculation
  Application.Calculation = xlCalculationManual

n = 0
v = 0

For j = 1 To 45000
DoEvents
  For i = 0 To 15
    m(n) = ws1.Cells(1 + j, 1 + i)
    n = n + 1
  Next i
  ' Shows progress situation
    Application.StatusBar = "Processing " & j & " row"
Next j

For u = 1 To 15000
DoEvents
  For l = 1 To 48
    ws2.Cells(1 + u, l) = m(v)
    v = v + 1
  Next l
    ' Shows progress situation
    Application.StatusBar = "Processing " & u & " Write"

Next u


'下記のプログラムだと9344.96秒かかってしまうので、配列処理に変更
'For j = 0 To 15499
'DoEvents
'   For i = 0 To 47
'    If i < 16 Then
'      ws2.Cells(2 + j, i + 1) = ws1.Cells(2 + 3 * j, 1 + i)
'    ElseIf i < 32 Then
'      ws2.Cells(2 + j, i + 1) = ws1.Cells(3 + 3 * j, i - 15)
'    Else
'      ws2.Cells(2 + j, i + 1) = ws1.Cells(4 + 3 * j, i - 31)
'    End If
'Next i
'  ' Shows progress situation
'    Application.StatusBar = "Processing " & j & " row"
'Next j

'Next i' Restore recalc setting
  Application.Calculation = xlCalculationAutomatic

Debug.Print "処理時間は " & Round(Timer - t, 2) & " 秒です。"

End Sub
・ツリー全体表示

【78580】Re:コンボボックスを使った行選択
発言  β  - 16/11/18(金) 8:07 -

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

>コンボボックスのRowSourceをつかって、一列選択出来るようにしています。

ここを見落としていました。
私のコードは無視してください。

ただ、個人的には、この【一列】をコンボボックスの RowSOurce にセットしている部分の
コードを見せてもらいたい気はします。
(一列の【どの部分】なのかが、気になっています)
・ツリー全体表示

【78579】Re:コンボボックスを使った行選択
発言  マナ  - 16/11/17(木) 23:45 -

引用なし
パスワード
        ▼しゅん さん:
>コンボボックスのRowSourceをつかって、一列選択出来るようにしています。

こんな感じだと、どうなりますか。

Private Sub ComboBox1_Change()
  With ComboBox1
    If .ListIndex < 0 Then Exit Sub
    Application.Goto Range(.RowSource).Rows(.ListIndex + 1)
  End With
End Sub
・ツリー全体表示

【78578】Re:コンボボックスを使った行選択
発言  β  - 16/11/17(木) 22:08 -

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

サンプルです。
元シート、"Sheet1"にしてあります。(★のところ2か所)
違っていれば、ここを変更してください。

元シートのどこに書く行のデータがあるかどうか、わからなかったので、
A列、1行目からということにしてあります。


Private Sub UserForm_Initialize()
  Dim w As Variant
  Dim i As Long
  Dim c As Range
  With Sheets("Sheet1")  '★
    With .Range("A1", .Range("A" & Rows.Count).End(xlUp))
      ReDim w(1 To .Rows.Count, 1 To 2)
      For Each c In .Cells
        i = i + 1
        w(i, 1) = c.Value
        w(i, 2) = c.Row
      Next
    End With
  End With
  With ComboBox1
    .RowSource = "" '念のため
    .MatchRequired = True
    .List = w
  End With
End Sub

Private Sub ComboBox1_Change()
  With ComboBox1
    If .ListIndex < 0 Then Exit Sub
    Application.Goto Sheets("Sheet1").Cells(.List(.ListIndex, 1), "A") '★
  End With
End Sub
・ツリー全体表示

【78577】コンボボックスを使った行選択
質問  しゅん  - 16/11/17(木) 21:01 -

引用なし
パスワード
   エクセルのVBA コンボボックスを使って、シートの中の一行を選択したいと思っています。
コンボボックスのRowSourceをつかって、一列選択出来るようにしています。そのコンボボックスで選んだものがある行を選択したいのですが、どうすればいいでしょうか?
よろしくお願いします。
・ツリー全体表示

【78576】Re:オートシェイプに名前を付ける方法
お礼  りった  - 16/11/16(水) 18:06 -

引用なし
パスワード
   おお!感動です。すばらしい。
セルの名前定義と一緒なんですね。(何故気が付かなかったのか。。。アホです。)
「オブジェクトの選択と表示」も便利です。
クイックアクセスツールバーに入れました。
実は、パワポマクロでも困っていたのですが、そっちも解決しました。
有難うございます。
・ツリー全体表示

【78575】Re:オートシェイプに名前を付ける方法
発言  β  - 16/11/15(火) 18:35 -

引用なし
パスワード
   ▼りった さん:

追加で。

シェープを選択し、右クリックで、メニューから
サイズとプロパティ、あるいは 図形の書式設定を選ぶと、いろいろ参照可能ですし
また、ここで、設定の変更もできます。

さらに、ホームタブ 検索と置換のオブジェクトの選択と表示 を選ぶと、シート上のシェープが列挙されます。
また、オブジェクトの選択 を選び、選択したいシェープ群をマウスで囲めば、それらが選択されます。
・ツリー全体表示

【78574】Re:オートシェイプに名前を付ける方法
発言  β  - 16/11/15(火) 18:30 -

引用なし
パスワード
   ▼りった さん:

>GUIで名前を変更したり、参照したりする方法を期待していました。
>例えば、「開発」リボンの「プロパティ」でWorksheetのプロパティが見れますが、
>そんな感じでオートシェイプも変更/参照出来ないものかと思ってました。

ふつうにできますよ。

・シェープを選びます。
・エクセル画面の左上のほう、名前ボックスがありますよね。
 ここに選んだシェープの名前が表示されていますので、この中を打ち直すと
 打ち直した名前が設定されます。(名前の変更ができます)

参照なら

・名前ボックスに、参照したいシェープの名前を入れてエンター
・そのシェープが選択されます。
・ツリー全体表示

【78573】Re:オートシェイプに名前を付ける方法
お礼  りった  - 16/11/15(火) 15:41 -

引用なし
パスワード
   回答有難うございます。
今作っているものには不向きですが、今後必要になった際に参考にさせて頂きます。
・ツリー全体表示

【78572】Re:オートシェイプに名前を付ける方法
お礼  りった  - 16/11/15(火) 15:38 -

引用なし
パスワード
   回答有難うございます。

GUIで名前を変更したり、参照したりする方法を期待していました。
例えば、「開発」リボンの「プロパティ」でWorksheetのプロパティが見れますが、
そんな感じでオートシェイプも変更/参照出来ないものかと思ってました。
(それ自体はマクロではありませんが、マクロにしか使わない操作ですので
マクロの掲示板で質問させて頂いております。)

ご教示頂いたコードをイミディエイトウィンドウから実行することで
とりあえずは何とかなります。有難うございます。
Selection.ShapeRange.Name = "Hoge"
? Selection.ShapeRange.Name

やってみて気が付いたのですが、変わった仕様(少なくとも私にとって)なんですね。
・複数のオートシェイプに同じ名前を付けることが可能。
・複数のオートシェイプに同じ名前(例:Hoge)を付けて、
 Sheet1.Shapes("Hoge").fill.ForeColor.RGB = RGB(0,255,0)
 すると、一つだけ緑になる。(最初に作ったオートシェイプ?)
・操作されたオートシェイプを削除して、再度
 Sheet1.Shapes("Hoge").fill.ForeColor.RGB = RGB(0,255,0)
 すると、別の一つが緑になる。(2番目に作ったオートシェイプ?)
・ツリー全体表示

【78571】Re:オートシェイプに名前を付ける方法
発言  カリーニン  - 16/11/14(月) 20:23 -

引用なし
パスワード
   横から失礼します。

下衆の勘繰りです。

シェイプにマクロを登録して呼び出す、ということが可能です。
この場合は、シェイプに名前を付けたり、名前を取得したりは不要です。

Sub test()
With ActiveSheet.Shapes(Application.Caller)
  .Left = .Left + 10
End With
End Sub
・ツリー全体表示

【78570】Re:オートシェイプに名前を付ける方法
発言  β  - 16/11/14(月) 19:11 -

引用なし
パスワード
   ▼りった さん:

名前を付けるには、どのシェープなのかを特定しなければいけませんね。
今作ったシェープに名前を付けるとか、今はこんな名前のシェープだけど、それを変更するとか
シート上のシェープをマウスで選択して、そのシェープに名前を付けるとか。

以下は、最後のケースの例でし。

Sub Sample()
  Selection.ShapeRange.Name = "Hoge"
End Sub

名前を参照する というのは、具体的には?

シート.Shapes("その名前") で参照できますよねぇ??
・ツリー全体表示

【78569】オートシェイプに名前を付ける方法
質問  りった  - 16/11/14(月) 18:45 -

引用なし
パスワード
   オートシェイプに名前を付ける方法及び名前を参照する方法が有ればご教示頂けますでしょうか?
・ツリー全体表示

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