Excel VBA質問箱 IV

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

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


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

【78593】Re:VLOOKUPを使いたい
発言  γ  - 16/11/23(水) 22:06 -

引用なし
パスワード
   ここはVBA(マクロ)の質問板なのですが、
それを承知で、マクロで実現したいということですか?
VLOOKUP式を普通にシートに書くのでは、なにかまずいことがあるのですか?
・ツリー全体表示

【78592】VLOOKUPを使いたい
質問  もよもと  - 16/11/23(水) 22:00 -

引用なし
パスワード
   Sheet1とSheet2があり、Sheet1のB1に入れた値
とSheet2のB1:B10にある値の中から一致した行と
C列〜E列の各交差するセル値をSheet1のC1:E1に各々入れたいです。
一致する値がない場合は、「該当なし」と表示したいです。

Sheet1のB2以降も上記と同様です。

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

【78591】Re:VBA内:未使用SUB、Function洗い出し
発言  独覚  - 16/11/22(火) 16:00 -

引用なし
パスワード
   ▼でじ さん:
この掲示板ではマルチポストは容認されていますが

>もしマルチポストをするのなら、可能な限り「○○にも同じ質問を出しました」ということを宣言してください。
>そして、仮に他のサイトで解決したのなら、ここにも必ずその顛末を書いてください。
>質問しっぱなし、というのはモラルに反します。
>「解決したからいいや」というのではありません。

となっています。

また、向こうには1時半ごろに回答がついていますがなぜそれには返事をせずにこちらにも
質問したのでしょうか?
・ツリー全体表示

【78590】VBA内:未使用SUB、Function洗い出し
質問  でじ  - 16/11/22(火) 15:49 -

引用なし
パスワード
   エクセルのVBA内に記述されているSUBやFunctionについて
使われていない物を洗い出したい。

例えばサブルーチン_Aを呼んでいる箇所について
ソース内を検索すれば解りますが、
subやfunctionの量も多く、
また調べたい対象ファイル数も多いので、
とてもハンド作業で出来るレベルではありません。
何か簡単に調べる方法はありますか?
・ツリー全体表示

【78589】Re:コンボボックスを使った行選択
発言  マナ  - 16/11/19(土) 9:10 -

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

>もう一つなのですが、この選択したセルにチェックボックスでチェックを付けると"1"がついていくというようにしたいのですが、どうすればよいでしょうか?

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

ユーザーフォームの操作なのか、シート上の操作のなのか、
どのような操作をイメージしておられるのか全くわかりません。

またマクロを実行した結果、どうなって欲しいのか全くイメージできません。
そもそも実行前の状態もわかっていません。

もう少し説明お願いします。


何となく、ユーザーフォーム(コンボボックス)は使わないで
オートフィルターで名前を絞り込んでから
該当する商品のセルに1を入力していけば良い気がします。
・ツリー全体表示

【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のプロパティが見れますが、
>そんな感じでオートシェイプも変更/参照出来ないものかと思ってました。

ふつうにできますよ。

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

参照なら

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

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