Excel VBA質問箱 IV

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

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


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

【77697】Re:四角形吹き出しの先っぽにあたる点が...
発言  γ  - 15/11/30(月) 22:35 -

引用なし
パスワード
   こんなことでしょうか。
それを選択状態にして実行してください。

Sub test()
  Dim sp As ShapeRange
  Dim a As Adjustments
  Dim wTop As Double, wLeft As Double, wWidth As Double, wHeight As Double
  Dim l As Double, t As Double
  Dim ovl As Shape
  
  Set sp = Selection.ShapeRange
  wTop = sp.Top
  wLeft = sp.Left
  wWidth = sp.Width
  wHeight = sp.Height
  
  Set a = sp.Adjustments
  l = wLeft + 0.5 * wWidth + a.Item(1) * wWidth
  t = wTop + 0.5 * wHeight + a.Item(2) * wHeight
  Set ovl = ActiveSheet.Shapes.AddShape(msoShapeOval, l, t, 1, 1)
  MsgBox ovl.TopLeftCell.Address
  ovl.Delete
End Sub
・ツリー全体表示

【77696】四角形吹き出しの先っぽにあたる点がどの...
質問  mumu  - 15/11/30(月) 21:56 -

引用なし
パスワード
   はじめて投稿させていただきます。

シート内に複数の四角形吹き出しがある場合、
個々の四角形吹き出しの左上端のセルは、TopLeftCell、
右下端のセルはBottomRightCell
で取得できたのですが、吹き出しの先っぽにあたる点(Adjustments.Item?)が
どのセル上にあるか知りたい場合はどうすればいいでしょうか?

初心者のため、見当違いの質問をしているかもしれませんが、
どうかご教授お願い致します。
・ツリー全体表示

【77695】Re:VBAを使い、別シートにデータを抽出し...
発言  β  - 15/11/30(月) 17:57 -

引用なし
パスワード
   ▼たけちゃんまん さん:

もう1つ参考までに。

↑で、オブジェクト(今回はシート)を短めの変数に格納して参照、
あるいは With オブジェクト でくくり、以降 ピリオドをつけて
.オブジェクトとして参照する利点を、コードがすっきりするとコメントしましたが
加えて、重要な利点があります。

たとえばコードで

SHeets("Sheet1").Range(なんたら) と参照すると、コードごとに、
そのシートオブジェクトをさがしに行きます。
一方、変数.Range(なんたら) や .Range(なんたら) と記述すると
シートオブジェクトをピンポイントで直接参照しますので、処理効率がアップします。
・ツリー全体表示

【77694】Re:お願いします
発言  独覚  - 15/11/30(月) 10:48 -

引用なし
パスワード
   しかも前回は知恵袋のExcelカテゴリで質問していたが今回は数学カテゴリと英語カテゴリの
二つに全く同じ質問文で…
・ツリー全体表示

【77693】Re:お願いします
発言  独覚  - 15/11/30(月) 10:40 -

引用なし
パスワード
   ▼arusu さん:
一度回答を書き込みましたがこのサイトのマルチポストを行いたい場合の方法
(マルチポストしているサイトを明記する)
に従っていないこと、個人的にマルチポストには回答したくないこと、質問文もコピー
(「以前にこの質問をした」ということなので、この掲示板で「arusu」を検索したがなかったので
ハンドル名を変えているのかと思ったら以前に知恵袋で質問していたようだ)
なので回答を削除しました。
・ツリー全体表示

【77692】Re:lzhを解凍する際、入っていたフォ...
発言  γ  - 15/11/30(月) 7:16 -

引用なし
パスワード
   UnlhaFindFirst や UnlhaFindNext というAPIを用いて
ファイル名を取得することができるかもしれませんね。
宣言方法などは、
ht tp://keep-on.com/excelyou/2001lng4/200101/01010096.txt
を参照してみてはいかがでしょうか。

# コメントしても無視する輩がいて気分が悪い。
・ツリー全体表示

【77691】Re:無限ループから他のマクロへの分岐
お礼  茶ー坊  - 15/11/30(月) 0:49 -

引用なし
パスワード
   ▼β さん:
有難うございました 書かれていることの内容はまだ完全には理解できてませんが
思い通りに動いてくれました now()関数を セルに書いておいて このマクロを走らせると 刻々と時刻が動いてくれました そう上で Proc1 Proc2 StopLoop で終了しました ・・・・ 素早いご回答ありがとうございました。
・ツリー全体表示

【77690】Re:無限ループから他のマクルへの分岐
発言  β  - 15/11/29(日) 22:34 -

引用なし
パスワード
   ▼茶―坊 さん:

γさんの回答を拝見して、あぁ、そうだと。
何も、βがアップしたような、とってつけたようなコード処理は不要でしたね。

以下のようなコードにして、ChangeStatusに たとえば ショートカットキー a、
StopLoop に ショートカットキー z を割り振っておけば、Ctrl/a で Proc1 と Proc2 の切り替え。
Ctrl/z で終了になりますね。

Dim flag As Boolean
Dim DoLoop As Boolean

Sub test()
  DoLoop = True
  flag = True
  Do
    If flag Then
      proc1
    Else
      Proc2
    End If
    
    DoEvents
    
  Loop While DoLoop
  
  Range("A1").Value = "終了"
  
End Sub

Sub proc1()
  Range("A1").Value = 1
End Sub

Sub Proc2()
  Range("A1").Value = 2
End Sub

Sub ChangeStatus() 'Ctrl/a
  flag = Not flag
End Sub

Sub StopLoop()
  DoLoop = False 'Ctrl/z
End Sub
・ツリー全体表示

【77689】Re:lzhを解凍する際、入っていたフォ...
回答  ペンネーム船長  - 15/11/29(日) 22:05 -

引用なし
パスワード
   ▼γ さん:
>後半部分は単なる思いつきです。
>別の方からAPIを利用したもっと良い案が出ると思いますので、
>いったんペンディングにしておいて下さい。

lzhがAフォルダーの中にあるときの解凍方法は調べて試してみたのですが、
これは私のやりたいことには未だ遠く及びません。

'DLLを使う事を宣言する
Private Declare Function Unlha Lib "UNLHA32.DLL" (ByVal Callhwnd As Long, ByVal LHACommand As String, ByVal RetBuff As String, ByVal RetBuffSize As Long) As Long
  
Private Sub CommandButton1_Click()

'********* UnLHA32.DLLを使ってLZHファイルを解凍する *********
Dim Ret As String * 255       'UnLHAからの結果を入れるバッファ(長さ255バイト)
Dim SendStr As String        'コマンド゙文字列
Dim sourceFile As String       '解凍する圧縮ファイル
Dim targetDir As String       '解凍先ディレクトリ
Dim Result As Long          '戻り値
Dim Msg1 As String
Dim oFolder As Object
          
targetDir = "C:\Temp\B" & "\"      '初期値は 同じディレクトリに解凍。
sourceFile = "C:\Temp\A" & "\" & "*.lzh" 'もうこの辺からお手上げ
SendStr = "e " & sourceFile & " " & targetDir
         '(スペースで区切っていることに注意)
                
Result = Unlha(0, SendStr, Ret, 255)      'UnLHA実行!
       
End Sub
・ツリー全体表示

【77688】Re:lzhを解凍する際、入っていたフォ...
発言  γ  - 15/11/29(日) 20:43 -

引用なし
パスワード
   後半部分は単なる思いつきです。
別の方からAPIを利用したもっと良い案が出ると思いますので、
いったんペンディングにしておいて下さい。
・ツリー全体表示

【77687】Re:lzhを解凍する際、入っていたフォ...
発言  γ  - 15/11/29(日) 20:11 -

引用なし
パスワード
   すみませんが、今できているところまで示してもらえますか?

ファイルの更新年月日は古いままでしょうから、
基本的なアイデアとしては、
・解凍先のフォルダのファイル名を予め保持しておいて、
・解凍後に増えたファイルを対象として、名前を書き換える
ことを実行すればいいんじゃないでしょうか。
・ツリー全体表示

【77686】lzhを解凍する際、入っていたフォルダ...
質問  ペンネーム船長  - 15/11/29(日) 19:23 -

引用なし
パスワード
   Aフォルダーの中にア・フォルダー、イ・フォルダ−、ウ・フォルダー等多数があります。
ア・フォルダ-の中には、圧縮ファイル「※.lzh」があります。イやウのフォルダーも同じ名前の「.lzh」が入っています。
「.lzh」は○○.csv、□□.xls、△△.pdfを圧縮したものです。
「.lzh」はBフォルダーに解凍します。
解凍にはUNLHA32.DLLを使います。
教えて欲しい内容:
ア、イ、ウ・・・フォルダーの中にある「.lzh」を解凍した際、csv、xls、pdf名の頭にフォルダー名(ア、イ、ウ・・・)を付けてBフォルダーに置くコードを教えて下さい。
Bフォルダーにはア○○.csv、ア□□.xls、ア△△.pdf、イ○○.csv、イ□□.xls、イ△△.pdf、ウ○○.csv、ウ□□.xls、ウ△△.pdf・・・が置かれるようにしたいのです。
宜しくお願いします。
・ツリー全体表示

【77685】Re:VBAを使い、別シートにデータを抽出し...
お礼  たけちゃんまん  - 15/11/29(日) 11:54 -

引用なし
パスワード
   βさま

お礼が遅くなり、申し訳ありません。

詳しく解説して下さり、ありがとうございます!
日頃からフィルターは使用しておりますが、ほんの一部しか使いこなせておりませんので、オートフィルター及びフィルターオプションについて、学ばせて頂きます。

明日、実行しながら学習させて頂き、結果をご報告させて頂きます。
・ツリー全体表示

【77684】Re:無限ループから他のマクルへの分岐
発言  β  - 15/11/28(土) 22:54 -

引用なし
パスワード
   ▼茶―坊 さん:

いまいち要件が分からないのですが、たとえば以下のコードは
最初 Proc1 が実行されます。
で、→キーをおすと Proc2 の実行に変わります。
←キーをおすと Proc1 の実行になります。
何度でも切り替えはできますが、Shiftキーを押すことで終了します。
Shiftキーは長めに押してください。

Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

Sub Test()
  Dim rtn As Long
  Dim flag As Boolean
  
  flag = True
  
  Do
  
    rtn = GetAsyncKeyState(vbKeyShift)
    rtn = rtn And &H80000000
    If rtn <> 0 Then Exit Do
    rtn = GetAsyncKeyState(vbKeyRight)
    rtn = rtn And &H80000000
    If rtn <> 0 Then flag = False
    rtn = GetAsyncKeyState(vbKeyLeft)
    rtn = rtn And &H80000000
    If rtn <> 0 Then flag = True
    
    If flag Then
      Proc1
    Else
      Proc2
    End If
    
    DoEvents
    
  Loop
  
  Range("A1").Value = "終了"
  
End Sub

Sub Proc1()
  Range("A1").Value = 1
End Sub

Sub Proc2()
  Range("A1").Value = 2
End Sub
・ツリー全体表示

【77682】無限ループから他のマクルへの分岐
質問  茶―坊  - 15/11/28(土) 21:00 -

引用なし
パスワード
   マクロ初心者です
 Sub macro1()

  for i=1 to 10

   Caluculate(再計算)

  ****************

  if i=10 then i=1

  next

 End Sub

極端な例ですが こんなループから
    **********
のところで他の Ctrl+Aとかで 他のマクロに分岐したいのですが 
車がある速度で走っているときの 刻々の 走行距離を表示し
途中で速度を変えたりするマクロを実行したいのですが
 如何でしょうか、よろしくお願いいたします
・ツリー全体表示

【77681】Re:VBAを使い、別シートにデータを抽出し...
発言  β  - 15/11/28(土) 13:48 -

引用なし
パスワード
   ▼たけちゃんまん さん

コードの解説(といってもそんなにたいそうなコードではないのですが)は以下の通りですが
その前に、是非、エクセルの強力な機能であるオートフィルターやフィルターオプションを
シート上の操作で体験して、その便利さを実感してください。
オートフィルターについてはおそらく、経験があるとは思いますが、「オートフィルター」
あるいは「フィルターオプション」で検索して、出てくるページの中でわかりやすいものを参考に
実際にやってみてください。
いずれも、処理効率も、ゴリゴリコードを書いて処理するより、格段に優れています。

フィルターオプションはオートフィルターに比べて、与える条件も細かに設定できますし
また、その場所でフィルタリングの他にフィルタリング結果を別の場所に抽出ということも
その標準機能の中で実現可能で、優れものです。
ただ、条件の設定がちょっと煩雑(?)で、最初は敬遠されがちかも。

いずれにしても、これら操作をマクロ記録しますと、私がアップしたコードが生成されます。

なお、オートフィルターでxl2007以降限定と書きましたが、オートフィルター自体は古くからある機能。
ただ、xl2003までは、抽出対象を2つまでしか与えられなかったのですが、xl2007以降、必要なだけ
与えることができるようになっています。

'フィルターオプション
  
  Application.ScreenUpdating = False

   '処理中の画面の動きを隠します。画面のちらつきを抑止するとともに、
   'セル書き込み時の処理効率をアップさせる効果があります。
  
  Set shT = Sheets("Sheet2") '転記シート

   'コード内で何度か参照しますので、短めの名前の変数に代入して
  '以降は shT を使います。コードが見やすくなる効果があります。

   shT.UsedRange.ClearContents
  
   'UsedRange は、そのシートで使用されている領域を矩形で表したアドレス領域。
   'これから、そのシートに転記するので、その前に、クリアしておきます。

  With Sheets("Sheet1")    '元シート

   '↑で shT に代入するコードがありましたが、もう1つ、オブジェクトを With でくくって
  '以下、End With までの間でそのオブジェクトを参照する場合、.そのオブジェクト という
   '記述ができます。これも、コードを見やすく、すっきりさせる効果があります。

    cols = .UsedRange.Columns.Count

   'UsedRange は使用領域。Sheet1 は A列 から始まっていますので、その列数が転記列数になります。

    Set r = .Range("A1", .UsedRange).Offset(1)

   'Sheet1 のタイトル行は2行目です。わかりにくいかもしれませんが
   '.Range("A1", .UsedRange) は、2行目から始まるリストの領域に1行目を加えた領域になります。
   'で、.Offset(1) は、それを1行下に移動させたところ、つまりリスト領域に、その下の空白行を
   '加えた領域になります。本来、この空白行は不要ですが面倒なので、リスト領域に含めています。
   '1行目が完全に空白行であれば .UsedRange.Offset(1) でいいのですが、そこが不明でしたので
  'あえて このような書き方にしました。

    .Cells(1, cols + 2).Value = .Range("I2").Value '抽出項目タイトル

   'フィルターオプションに与える抽出条件項目名を、リスト領域の外につくります。

    .Cells(2, cols + 2).Resize(3).Value = WorksheetFunction.Transpose(Array("'=b001", "'=b002", "'=b003"))

   'その下、2行目以降に抽出文字列を3つセットしています。たんに b001 といった文字列にしますと
   'b001 からはじまるものすべてが対象になりますので = を付けて完全一致条件にしています。

    r.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Cells(1, cols + 2).CurrentRegion, _
                CopyToRange:=shT.Range("A1"), Unique:=False

   'この1行がフィルターオプション実行コードです。抽出結果を SHeet2のA1から始まる領域に転記します。

    .Cells(1, cols + 2).CurrentRegion.Clear

   '処理後、リスト領域の外側に作った条件欄をクリアします。

  shT.Select

   '処理結果が目で見れるように最後に Sheet2をアクティブにします。
  
'オートフィルター

  ★フィルターオプションで説明したコードについては割愛します。

    .AutoFilterMode = False

   '念のため、オートフィルターモードを解除します。

    r.AutoFilter Field:=9, Criteria1:=Array("b001", "b002", "b003"), Operator:=xlFilterValues

   'この1行で、リストのI列に指定の文字列があるものをフィルタリングします。

    If r.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then r.Copy shT.Range("A1")

   '抽出があった場合、タイトル行以外にデータ行がありますので、その状態かどうかを判定し
  '抽出されていれば、オートフィルター領域を Sheet2の A1から始まる場所にコピペします。
   'ここが、オートフィルターの「ミソ」なんですが、抽出されたものだけがコピペ対象になります。

    .AutoFilterMode = False

   '処理後、オートフィルターモードを解除します。
・ツリー全体表示

【77680】Re:VBAを使い、別シートにデータを抽出し...
お礼  たけちゃんまん  - 15/11/28(土) 0:48 -

引用なし
パスワード
   βさま

フィルターオプション並びにオートフィルターについてのお礼が一つになってしまい、申し訳ありません。

excel2010を使用しておりますので、オートフィルターも実行させて頂きます!
・ツリー全体表示

【77679】Re:VBAを使い、別シートにデータを抽出し...
お礼  たけちゃんまん  - 15/11/28(土) 0:32 -

引用なし
パスワード
   βさま

迅速にご対応頂き、ありがとうございます!
早速、実行してみたいところではあるのですが、会社PCの会社サーバーでの作業となる為、すぐに結果のご報告が出来ず、申し訳ありません…。
月曜日にフィルターオプション及びオートフィルターの双方を実行させて頂き、結果をご報告させて頂きますので、お時間を頂けますでしょうか。宜しくお願い致します。

βさまにお伺いするのは厚かましいのは承知の上で、一つお願いがございます。

それぞれのコードがどの様な働きをしているのか、ご教授頂きたいのですが…。今回、ご教授頂いたコードについて学習し、これから先の作業に活かせる様にしたいと思っておりますので、宜しくお願い致します。
・ツリー全体表示

【77678】Re:VBAを使い、別シートにデータを抽出し...
発言  β  - 15/11/28(土) 0:06 -

引用なし
パスワード
   ▼たけちゃんまん さん

オートフィルター版も。
ただし、xl2007以降限定。

Sub Sample2()  'オートフィルター
  Dim cols As Long
  Dim r As Range
  Dim shT As Worksheet
 
  Application.ScreenUpdating = False
 
  Set shT = Sheets("Sheet2") '転記シート
  shT.UsedRange.ClearContents
 
  With Sheets("Sheet1")    '元シート
    cols = .UsedRange.Columns.Count
    Set r = .Range("A1", .UsedRange).Offset(1)
    .AutoFilterMode = False
    r.AutoFilter Field:=9, Criteria1:=Array("b001", "b002", "b003"), Operator:=xlFilterValues
    If r.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then r.Copy shT.Range("A1")
    .AutoFilterMode = False
  End With
 
  shT.Select
 
End Sub
・ツリー全体表示

【77677】Re:VBAを使い、別シートにデータを抽出し...
発言  β  - 15/11/27(金) 23:49 -

引用なし
パスワード
   ▼たけちゃんまん さん

フィルターオプションやオートフィルター処理が適していると思います。
以下はフィルターオプション。
元シート名や転記先シート名は実際のものに変更してください。

Sub Sample()  'フィルターオプション
  Dim cols As Long
  Dim r As Range
  Dim shT As Worksheet
  
  Application.ScreenUpdating = False
  
  Set shT = Sheets("Sheet2") '転記シート
  shT.UsedRange.ClearContents
  
  With Sheets("Sheet1")    '元シート
    cols = .UsedRange.Columns.Count
    Set r = .Range("A1", .UsedRange).Offset(1)
    .Cells(1, cols + 2).Value = .Range("I2").Value '抽出項目タイトル
    .Cells(2, cols + 2).Resize(3).Value = WorksheetFunction.Transpose(Array("'=b001", "'=b002", "'=b003"))
    r.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Cells(1, cols + 2).CurrentRegion, _
                CopyToRange:=shT.Range("A1"), Unique:=False
    .Cells(1, cols + 2).CurrentRegion.Clear
  End With
  
  shT.Select
  
End Sub
・ツリー全体表示

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