Excel VBA質問箱 IV

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

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


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

【75215】Re:複数の範囲(膨大)を、変数に取り込む
発言  kanabun  - 14/1/8(水) 17:06 -

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

あ、ごめんなさい。別のこと考えてました。
>全部のセルの記号に重複がなくユニークだったとしても、セル数 n は6075種類
>ですから、
>>Dim n As Long
>でいいのです(最大6075ですからInteger型でもいいのですが、Long型が最善です)
↑ここまでの文章は、ウソです。無視してください m(_ _)m

[C8] は部数?(数値)が書いてあるんではないですか?
数値以外の記号のこともあるんですか?
・ツリー全体表示

【75214】Re:複数の範囲(膨大)を、変数に取り込む
発言  kanabun  - 14/1/8(水) 16:57 -

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

>記号が不定のことが多い場合、
>
>Dim n As Long
>
>をstringかvariantに変えれば上手くいきますでしょうか。
>
>実はちょっと試したところ、C8の行の記号が勝手に書き換わるという現象が起き、
> ???という状態です。

そんなことしてもダメです。
全部のセルの記号に重複がなくユニークだったとしても、セル数 n は6075種類
ですから、
>Dim n As Long
でいいのです(最大6075ですからInteger型でもいいのですが、Long型が最善です)

こちらで動作を確かめるために、適当なデータをシート上に作成するために書いた
コードがありますから、そちらでも、新規シートをアクティブにして、↓を走らせて
ダミーデータを作成したものに対して、
Sub test3() を走らせて、どうなるか、テストしてみてください。


Sub test31データ埋め込み()
  Dim j As Long
  Dim y As Long, x As Long
  Dim Label As String
  Dim c As Range
  Dim r As Range
  Const Y0 = 8, YY = 25, Ystp = 16 '縦方向 最初の行、繰り返し回数,Step
  Const X0 = 5, XX = 27, Xstp = 3 '列方向 最初の列、繰り返し回数,Step
  
  Const Lo = 1, Hi = 2000
  Randomize
  
  j = 0
  Cells.Interior.ColorIndex = xlNone
  For x = X0 To X0 + (XX - 1) * Xstp Step Xstp
   For y = Y0 To Y0 + (YY - 1) * Ystp Step Ystp
     Set r = Cells(y, x).Resize(9)
     r.Interior.Color = vbCyan
     For Each c In r
       c(1, -1).Value = Int(Hi * Rnd() + Lo)
       j = j + 1: If j > 14 Then j = 1
       c.Value = Mid$("ABCDABCDKLMXYZ", j, 1)
     Next
    Next
  Next
End Sub
・ツリー全体表示

【75213】Re:複数の範囲(膨大)を、変数に取り込む
お礼  初心者M  - 14/1/8(水) 15:00 -

引用なし
パスワード
   kanabun様

本当に有り難うございました。
記号が不定のことが多い場合、

Dim n As Long

をstringかvariantに変えれば上手くいきますでしょうか。

実はちょっと試したところ、C8の行の記号が勝手に書き換わるという現象が起き、???という状態です。書き換わった後は、上手い具合に最大値に揃っているようです。

あまり頼りっぱなしもよくないと思うのですが、もし、万が一、心とお時間に余裕が有れば、またお教えいただけると光栄です。

有り難うございます。
・ツリー全体表示

【75212】Re:複数の範囲(膨大)を、変数に取り込む
発言  kanabun  - 14/1/8(水) 14:35 -

引用なし
パスワード
   ▼初心者M さん:
>
>実は、見たいセル(A、イなどの記号があるセル)はD8でなく、一個隣のC8にあります(すみません、昨日とは違うファイルでやることになったのです)。
>
>この場合、どこをいじれば良いでしょうか?

>  b = r.Offset(, -1).Value
>
>の「-1」を「-2」にしたら上手くいったのですが、

今回も「-1」を「-2」にすればいいですよ

  For x = X0 To X0 + (XX - 1) * Xstp Step Xstp
   For y = Y0 To Y0 + (YY - 1) * Ystp Step Ystp
     For Each c In Cells(y, x).Resize(9)
      ss = c.Value
      If Len(ss) > 0 Then
       n = c.Offset(, -1).Value  '◆ココと
       If Not dic.Exists(ss) Then
         dic(ss) = n
       ElseIf dic(ss) < n Then
         dic(ss) = n
       End If
      End If
     Next
    Next
  Next
  For x = X0 To X0 + (XX - 1) * Xstp Step Xstp
   For y = Y0 To Y0 + (YY - 1) * Ystp Step Ystp
     For Each c In Cells(y, x).Resize(9)
      ss = c.Value
      If Len(ss) > 0 Then
        c.Offset(, -1).Value = dic(ss) '◆ココ
      End If
     Next
    Next
  Next
・ツリー全体表示

【75211】Re:複数の範囲(膨大)を、変数に取り込む
質問  初心者M  - 14/1/8(水) 13:59 -

引用なし
パスワード
   kanabun様

昨日に引き続き、誠に有り難うございます。
作っていただいた物を拝見するたび、高度かつ難解なので、自分のやろうとしていたことは、かなり分不相応なことだったのだと思い知らされます。

丸々聞いてしまうのはルール違反かと思うのですが、ちょっと私では理解できないので、以下もお教えいただけると光栄です。

実は、見たいセル(A、イなどの記号があるセル)はD8でなく、一個隣のC8にあります(すみません、昨日とは違うファイルでやることになったのです)。

この場合、どこをいじれば良いでしょうか?
ちなみに昨日の場合では
 
  a = r.Value      
  b = r.Offset(, -1).Value

の「-1」を「-2」にしたら上手くいったのですが、今回は複雑で、なかなか理解が追いつきません。

ちなみに、先ほどのコードをそのまま手元の表で動かしたところ、e8のすぐ隣の行に全て「0」が記入されました。

大変恐縮ですが、何卒よろしくお願いいたします。
・ツリー全体表示

【75210】Re:複数の範囲(膨大)を、変数に取り込む
発言  kanabun  - 14/1/8(水) 13:18 -

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

>手元の表は...縦にはセルe8からe16まで、7個空けてe24からe32まで、とこれが下に25回並んでおり、横方向にはe8から2個空けてh8からh16まで、また2個空けてk8からk16までという具合に、こちらは27回並んでいます。

う〜ん、それだけたくさんのエリアだと、配列化はしにくいですね。
ちょっと時間はかかるけど、セルに直接アクセスしましょう。
最初のセルが[E8]で、[D8]に数値(部数)が書いてあると仮定します。

>  '縦25回
>  '横27回

ですから、縦方向へは 16セルづつジャンプすると、各エリア(連続範囲のこと)の
先頭セルですね。
列方向は 3セルづつジャンプしながら、27回。
こうして各エリアの先頭セルが求まりますから、
先頭セルから行方向に9セル Resizeしたセル範囲が対象エリアです。

Sub test3()
  Dim n As Long
  Dim y As Long, x As Long
  Dim ss As String
  Dim c As Range
  Const Y0 = 8, YY = 25, Ystp = 16 '縦方向 最初の行番、繰り返し回数,Step
  Const X0 = 5, XX = 27, Xstp = 3 '列方向 最初の列番、繰り返し回数,Step
  Dim dic As Object
  Set dic = CreateObject("Scripting.Dictionary")
  
  For x = X0 To X0 + (XX - 1) * Xstp Step Xstp
   For y = Y0 To Y0 + (YY - 1) * Ystp Step Ystp
     For Each c In Cells(y, x).Resize(9)
      ss = c.Value
      If Len(ss) > 0 Then
       n = c.Offset(, -1).Value
       If Not dic.Exists(ss) Then
         dic(ss) = n
       ElseIf dic(ss) < n Then
         dic(ss) = n
       End If
      End If
     Next
    Next
  Next
  For x = X0 To X0 + (XX - 1) * Xstp Step Xstp
   For y = Y0 To Y0 + (YY - 1) * Ystp Step Ystp
     For Each c In Cells(y, x).Resize(9)
      ss = c.Value
      If Len(ss) > 0 Then
        c.Offset(, -1).Value = dic(ss)
      End If
     Next
    Next
  Next
  
End Sub
・ツリー全体表示

【75209】複数の範囲(膨大)を、変数に取り込む
質問  初心者M  - 14/1/8(水) 12:03 -

引用なし
パスワード
   昨日「複数の異なる値を取り込んで、順に処理したいです」という質問をさせていただいた者です。その節はお世話になりました。
この際、回答者の方に作って頂いたコードを自分の手元の表に応用する方法で、また悩んでいます。

手元の表は(違う形式もありますが)縦にはセルe8からe16まで、7個空けてe24からe32まで、とこれが下に25回並んでおり、横方向にはe8から2個空けてh8からh16まで、また2個空けてk8からk16までという具合に、こちらは27回並んでいます。

これを、昨日の回答で頂いた以下のコードの「r」に入れたいのですが、どのような方法が良いか、ご指導いただけませんでしょうか。
自分では(E8:E16,E24:E32,E40:E48,E56:E64,E72:E80,E88:E96,E104:E112,E120:E128)と羅列するような方法しか思いつきませんでした。

よろしくお願いいたします。


Sub test()

  Dim a, b As Variant
  Dim i As Long
  Dim r As Range
  Dim dic As Object

  Set dic = CreateObject("Scripting.Dictionary")
 
  Set r = Range("e8", Range("e8").End(xlDown))
  
  a = r.Value      
  b = r.Offset(, -2).Value
  
  For i = 1 To 9 'UBound(b)
    If Not dic.Exists(b(i, 1)) Then
      dic(b(i, 1)) = a(i, 1)
    ElseIf dic(b(i, 1)) < a(i, 1) Then
      dic(b(i, 1)) = a(i, 1)
    End If
  Next
  
  '縦25回
  '横27回
  
  For i = 1 To 9 'UBound(b)
    a(i, 1) = dic(b(i, 1))
  Next
  r.Value = a
 
End Sub
・ツリー全体表示

【75208】Re:部分一致で検索してファイルを開く
お礼    - 14/1/8(水) 8:59 -

引用なし
パスワード
   おはようございます。

大変細かいコードまで書いてくださって・・・ありがとうございます。
一度このコードをもとにやってみます。
わからなかったら、またご質問させていただくかもしれませんが、その時は宜しくお願いします。
・ツリー全体表示

【75207】Re:別ファイルへの貼り付けができない。
発言  γ  - 14/1/7(火) 23:14 -

引用なし
パスワード
   > Sheets(2).Range("B20:BL21").Copy xlBook.Worksheets(1).Range("B25")
二つは別のExcelアプリケーションに属していますから、
それらをまたいでCopyを一つの文で実行することはできません。
・ツリー全体表示

【75206】別ファイルへの貼り付けができない。
質問  miki88  - 14/1/7(火) 21:33 -

引用なし
パスワード
   win7でEXCEL2010です。
フォーマットファイル(AAA.xls)のセルをコピーし、別ファイル(BBB.xls)へ貼り付けるマクロを作成していました。
しかし、フォーマットファイルが別にあるのは・・・という話があがりました。
マクロが組み込まれているファイルにフォーマットファイルのシートを全く同じシート(sheet2)を作成し、そこからBBB.xlsへ貼り付けをしようとしたのですが、エラーになってしまいます。
(実行時エラー '1004': Range クラスの Copy メソッドが失敗しました。)

1.ができて2.ができない原因が分かりません。
お心当たりの方はいらっしゃらないでしょうか。
よろしくお願いします。

マクロ↓
Private Sub test()
 Dim xlApp As Excel.Application
 Dim xlBook As Excel.Workbook
 Dim xlYBook As Excel.Workbook
 Set xlApp = New Excel.Application
 Set xlBook = xlApp.Workbooks.Open(BBB.xlsのパス)
 Set xlYBook = xlApp.Workbooks.Open(AAA.xlsのパス)

 '↓1.貼り付けできている。
 xlYBook.Worksheets(1).Range("B20:BL21").Copy xlBook.Worksheets(1).Range("B23")
 '↓2.貼り付けできずエラー
 Sheets(2).Range("B20:BL21").Copy xlBook.Worksheets(1).Range("B25")

 xlBook.Save
 xlBook.Close
  
 xlYBook.Close
 Set xlBook = Nothing
 Set xlYBook = Nothing
 xlApp.Quit
 Set xlApp = Nothing
  
End Sub

マクロ↑
・ツリー全体表示

【75205】Re:部分一致で検索してファイルを開く
発言  kanabun  - 14/1/7(火) 17:45 -

引用なし
パスワード
   ▼r さん:
>VBAでファイルを検索して開く際に、部分一致でファイルを探してきて開くことは可能なのでしょうか。
>部分一致で探したいんです。

検索パターンを指定して、検索フォルダを指定し、
ヒットしたファイルを表示するコード例です。

Sub Try1()
 Call SearchFile("abc*.csv")  '検索パターン
End Sub

Private Sub SearchFile(Filename As String)
 Dim myFolder As String
 '検索のトップフォルダをダイアログで指定
  Dim oFolder As Object
  Const BIF_RETURNNONLYFSDIRS = &H1  'ディレクトリのみ選択可
  Const BIF_EDITBOX = &H10      'アイテム名入力用のEdit_boxを表示
  Dim hWnd As Long
  
  hWnd = Application.hWnd
  With CreateObject("Shell.Application")
   Set oFolder = .BrowseForFolder(hWnd, _
         "フォルダを選択して下さい", _
         BIF_RETURNNONLYFSDIRS Or BIF_EDITBOX, _
         CreateObject("WScript.Shell").SpecialFolders("DeskTop"))
   If (oFolder Is Nothing) Then Exit Sub
   myFolder = oFolder.Self.Path
  End With
  If Right$(myFolder, 1) <> "\" Then myFolder = myFolder & "\"
 
 'サブフォルダを含むファイルのワイルドカード検索
  Dim FoundFiles() As String
  Dim tmpPath As String
  Dim sCmd As String
  Dim ko As Long
  
  '---- Dirコマンドによるサブフォルダを含むファイル名の検索
  Filename = myFolder & Filename
  tmpPath = Environ$("Temp") & "\Dir.tmp" '一時ファイルパス

  sCmd = "DIR """ & Filename & """ /b/s/a:-D > """ & tmpPath & """"
           '' /b ファイル名のみ
           '' /s サブディレクトリも検索
           '' /a:-D サブディレクトリー名は表示しない

  With CreateObject("WScript.Shell")
    ko = .Run("CMD /C " & sCmd, 7, True) 'Dirコマンド実行
  End With
  If ko Then
    MsgBox "ファイルの検索に失敗しました", , Filename
    Exit Sub
  End If
  If FileLen(tmpPath) < 2 Then Exit Sub 'ファイルが見つからなかった

  '----- Dirコマンドで取得したファイル名を配列に格納
  Dim io As Integer
  Dim buf() As Byte
  io = FreeFile()
  Open tmpPath For Binary As io
   ReDim buf(1 To LOF(io))
   Get #io, , buf
  Close io
  Kill tmpPath
  FoundFiles() = Split(StrConv(buf, vbUnicode), vbCrLf)
  ko = UBound(FoundFiles)
  ReDim Preserve FoundFiles(ko - 1)
  MsgBox ko & "個のファイルがみつかりました" & vbCr _
   & Join(FoundFiles(), vbCr)
End Sub


ヒットしたファイルは複数あるかもしれないので、とりあえずMsgBoxに
表示しています。
・ツリー全体表示

【75204】Re:複数の異なる値を取り込んで、順に処...
お礼  初心者M  - 14/1/7(火) 17:28 -

引用なし
パスワード
   kanabun様

引き続き有り難うございます。
Resizeというのも初めて見ました。きちんと意味を理解して使いたいので、これからDictionaryと併せて勉強していきます。

こういった物をパッと作れる方は本当に尊敬します。

また行き詰ったらこの掲示板でお力をお借りするかも知れません。
この度は本当に助かりました。

有り難うございました。
・ツリー全体表示

【75203】Re:複数の異なる値を取り込んで、順に処...
発言  kanabun  - 14/1/7(火) 17:05 -

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

>頂いたコードを最初に試した際、何故か「最小値」を取ってきてしまっていたので
>
>ElseIf dic(b(i, 1)) > a(i, 1) Then
>
>の「>」を「<」に変えたところ、上手くいきました。

あー、逆でした。失礼しました m(_ _)m
おわびに、
[H6]セルを先頭とする39行×26列の表があるときの test応用です。

Sub test2()
  Dim a
  Dim i As Long, j As Long, n As Long
  Dim r As Range
  Dim dic As Object
  Set dic = CreateObject("Scripting.Dictionary")
  
  Set r = Range("H6").Resize(39, 26) '[H6]を左上とする39行×26列
  a = r.Value       '表全部の値

  For j = 2 To UBound(a, 2) Step 2 '列方向 1列おき
    For i = 1 To UBound(a, 1)   '行方向
      If Not IsEmpty(a(i, j)) Then
       n = a(i, j - 1)
       If Not dic.Exists(a(i, j)) Then
         dic(a(i, j)) = n
       ElseIf dic(a(i, j)) < n Then
         dic(a(i, j)) = n
       End If
      End If
    Next
  Next
  For j = 2 To UBound(a, 2) Step 2 '列方向 1列おき
    For i = 1 To UBound(a, 1)   '行方向
      If Not IsEmpty(a(i, j)) Then
        a(i, j - 1) = dic(a(i, j))
      End If
    Next
  Next
  r.Value = a
  
End Sub

いちおう、空白セルは実行しないようにしました。
・ツリー全体表示

【75202】Re:複数の異なる値を取り込んで、順に処...
お礼  初心者M  - 14/1/7(火) 15:54 -

引用なし
パスワード
   kanabun様

お世話になります。度々すみません。
試したところ、上手くいきました!後は、元々の表に合わせてうまいこと変えていくだけです。これも大変そうですが、多分できると思います。

頂いたコードを最初に試した際、何故か「最小値」を取ってきてしまっていたので

ElseIf dic(b(i, 1)) > a(i, 1) Then

の「>」を「<」に変えたところ、上手くいきました。

これで、私の課の作業効率が上がります。
本当にありがとうございました。
・ツリー全体表示

【75201】Re:複数の異なる値を取り込んで、順に処...
お礼  初心者M  - 14/1/7(火) 15:29 -

引用なし
パスワード
   kanabun様

お返事ありがとうございます。
Dictionaryオブジェクトという概念は初耳で、大変勉強になります。

教えていただいたコードを早速手元の表に応用しようと思うのですが、何分初心者なので明日までかかるかと思います。

まずはお礼まで。何卒今後も、お時間と余裕があればご指導の程よろしくお願いいたします。
・ツリー全体表示

【75200】部分一致で検索してファイルを開く
質問    - 14/1/7(火) 15:23 -

引用なし
パスワード
   VBAでファイルを検索して開く際に、部分一致でファイルを探してきて開くことは可能なのでしょうか。

パスとファイル名を指定して開くVBAならできたのですが・・・
指定せずに、検索して部分一致で探したいんです。
・ツリー全体表示

【75199】Re:複数の異なる値を取り込んで、順に処...
発言  kanabun  - 14/1/7(火) 14:56 -

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

 A列  B列
>5100 A
>7600 イ
>6800 イ
>
>などのようなデータが数行に渡って存在する表で、同じ「イ」なら大きい数の7600に合わせる、というような処理をしたいです。
>「A」や「イ」などの記号は、無作為に数パターン存在します。

>参考までに、記号が無作為でなく、「A」と決め打ちであれば、下のコードで動きます。
その考え方でいいとおもいますよ。

簡単のため、表は A列、B列だけの構成と考えます。

以下は、「A」だけでなく、複数のキーワードに対応するために、
Dictionaryオブジェクトを使って複数キーワードを登録できるように
したものです。
あるキーワードがまだ辞書に登録されていなければ、そのキーワードと
その行のA列の数値を「組データ」として登録しておきます。
すでに登録済みのキーワードが出てきたら、その行のA列の数値を 現在登録
されている数値と比較して、これより大きいときだけ、そのキーの数値を更新
します。
これを最後の行まで繰り返すと、キーワードごとに数値の最大値の入った配列
ができますので、
最後にもとのA列をこの配列で上書きしてやります。

Sub test()
  Dim a, b
  Dim i As Long
  Dim r As Range
  Dim dic As Object
  Set dic = CreateObject("Scripting.Dictionary")
  
  Set r = Range("A6", Range("A6").End(xlDown))
  a = r.Value       'A列の値
  b = r.Offset(, 1).Value 'B列の値
  For i = 1 To UBound(b)
    If Not dic.Exists(b(i, 1)) Then
      dic(b(i, 1)) = a(i, 1)
    ElseIf dic(b(i, 1)) > a(i, 1) Then
      dic(b(i, 1)) = a(i, 1)
    End If
  Next
  For i = 1 To UBound(b)
    a(i, 1) = dic(b(i, 1))
  Next
  r.Value = a
  
End Sub
・ツリー全体表示

【75198】複数の異なる値を取り込んで、順に処理し...
質問  初心者M  - 14/1/7(火) 10:38 -

引用なし
パスワード
   初めて質問します。過去ログ拝見しましたが、解決策が無いようでしたので書きます。

ある表を整理する方法で悩んでいます。

5100 A
7600 イ
6800 イ

などのようなデータが数行に渡って存在する表で、同じ「イ」なら大きい数の7600に合わせる、というような処理をしたいです。
「A」や「イ」などの記号は、無作為に数パターン存在します。

アレイ関数や配列変数などいろいろ調べてみたのですが、上手い手が思いつきません。
記号を取り込んで、順に取り出せるような処理をお教えいただけませんか。

参考までに、記号が無作為でなく、「A」と決め打ちであれば、下のコードで動きます。

初心者なのでお恥ずかしいですが載せておきます。
宜しくお願い致します。

___________________________________

Public Sub 持ち上げ()

Dim x As Integer '行
Dim y As Integer '列

Dim Int1 As Integer '部数
Dim Int2 As Integer '部数最大値


'最大値を取得

For x = 6 To 44
  For y = 8 To 33
  
    If Cells(x, y).Value = "A" Then
    
      Int1 = Cells(x, y - 1).Value
      
        If Int1 > Int2 Then
        Int2 = Int1
       
        End If
    End If
  
  Next
Next

'最大値に揃える

For x = 6 To 44
  For y = 8 To 33
  
    If Cells(x, y).Value = "A" Then
Cells(x, y - 1).Value = Int2

 End If
  Next
Next
・ツリー全体表示

【75197】Re:vbaエディタ画面でショートカットキー...
発言  γ  - 14/1/6(月) 20:38 -

引用なし
パスワード
   >vbaエディタ画面を開いている状態でもショートカットキーからマクロを実行する方法はありますでしょうか?
むずかしいのではないでしょうか。
Windowsからみたら、VBE画面もWordもExcel本体と違うという意味では
どちらも同じです。別のアプリからExcelは操作できません。
VBE画面にはマクロを登録できないので、
手でExcel本体をアクティブにする動作がどうしても必要になると思います。
・ツリー全体表示

【75196】vbaエディタ画面でショートカットキーか...
質問  たかし  - 14/1/6(月) 11:55 -

引用なし
パスワード
   autoオープン処理にてapplication.onkeyを使ってマクロにショートカットキーを割り当てたのですが、このショートカットキーがExcelのシートが表示されている時には実行されるのですが、vbaエディタ画面を開いている時には実行してくれません。
vbaエディタ画面を開いている状態でもショートカットキーからマクロを実行する方法はありますでしょうか?
ショートカットキーから呼び出されるマクロの内容は、ユーザーフォームを開くだけの処理です。
・ツリー全体表示

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