Excel VBA質問箱 IV

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

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


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

【78372】隣の列と同じ行までコピーするについて
質問  [名前なし]  - 16/7/28(木) 14:52 -

引用なし
パスワード
   .Range("A1:A1").AutoFill Destination:=Range("A1:A" & Range("B1").End(xlDown).Row()) 'Sheet1の列「A1」を列「B1」と同じ行までコピーと貼り付けをする。

複数行なら問題なくマクロが動くんですが、1行の場合一番下までマクロが動きます。
1行の場合も問題なくマクロが動くようにしたいのですが、どうすればいいですか?
・ツリー全体表示

【78371】Re:すみません、説明不足でした
質問  acs  - 16/7/28(木) 12:00 -

引用なし
パスワード
   Win7,2010でも正常に動作がすることが確認できました。

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

Win7,2010

Win10,2010

での画像サイズの微妙な違いですが、

実際の画像貼り付けはA1:A8のセルが結合されている部分に貼りつけているのですが

Win10,2010で作成するとセルの高さが1行が39ピクセルなのですが

win7,2010で同じファイルを開くと何故か49ピクセルになっていました。

これはVBAの話ではなくOSの問題なんでしょうか?

ちなみにWin7はネットに繋がっていないのでバグの修正はなっていません
・ツリー全体表示

【78370】Re:すみません、説明不足でした
お礼  acs  - 16/7/28(木) 0:47 -

引用なし
パスワード
   β さん、返答ありがとうごさいます。

明日、会社に行ったら試してみたいと思います。

頼りっきりなので少し自分なりに考え、ダメそうな時
またお願いいたします。
・ツリー全体表示

【78369】Re:すみません、説明不足でした
発言  β  - 16/7/27(水) 19:05 -

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

>(Win7,2010)では前写真は削除されませんでした。

こちらのWin7+xl2010では全く問題なく処理できています。
なお、VBAでは A1 にある画像 という指定ができません。
なので、コードを見てもらえればわかるとおり、シート上の画像を全て撮りだし
その画像の左上隅がA1内にあるものを(全て)削除しています。
これで削除できないということは
・左上隅がA1内にない。
・それが画像(Picture)ではなく別のもの(たとえば四角形のシェープ)
いずれかでしょうねぇ。


>A1の縦のサイズに合わせて、縦横比固定というのが良さそうです。

.Width = .Width * 0.3

これを

.Height = Target.Height

で、どうぞ。
・ツリー全体表示

【78368】Re:すみません、説明不足でした
質問  acs  - 16/7/27(水) 17:32 -

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

ご回答いただきありがとうございました。


早速、試したところ(Win10,2010)では良好でしたが。
(Win7,2010)では前写真は削除されませんでした。
詳しいver14.0,4760,1000(32bit)

なぜでしょうか?

さらに追加なのですが、写真の大きさによって縮尺倍率が固定だと、
変になってしまいますのでA1の縦のサイズに合わせて、縦横比固定
というのが良さそうです。

あまり急ぎませんので、よろしくお願いいたします
・ツリー全体表示

【78367】Re:すみません、説明不足でした
発言  β  - 16/7/27(水) 15:33 -

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

まず

> Q.参照マクロで写真を貼りつけるとPC1(Win10,2010)だと問題ないのですが
> PC2(Win7,2010)はちょっとだけ大きくなり、PC3(Win7,Excel2007)だと横長になってしまいます。これは仕方のないことなのでしょうか?

私が持っている環境は win7+xl2010とwin10+xl2013 のみですが、大きさに関しては
あまり気にしたことはありません。厳密に測れば、ちょっとは差異があるのかもしれませんが。

で、xl2007 に関しては、こと、図にかんしては(それ以外にも不具合多々あるようですが)
バグだらけのようですので、比較の対象にはされないほうがよろしいかと思います。

いずれにしても A1 にのみ写真を貼り付けるサンプルです。

Sub Sample()
  Dim pic As Picture
  Dim f As Variant
  Dim Target As Range
  
  'A1の画像を削除
  For Each pic In ActiveSheet.Pictures
    If pic.TopLeftCell.Address = "$A$1" Then pic.Delete
  Next
  
  Set Target = Range("A1")
  
  f = Application.GetOpenFilename _
      ("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False)
  If f <> False Then
    With ActiveSheet.Shapes.AddPicture(Filename:=f, LinkToFile:=False, _
      SaveWithDocument:=True, Left:=Target.Left, Top:=Target.Top, _
      Width:=-1, Height:=-1)   '-1 元の大きさで貼り付け
      '===============タテヨコの縮尺を保持して拡大または縮小
      .LockAspectRatio = True   '縦横比率の維持(念のため)
      .Width = .Width * 0.3
    End With
  End If

End Sub
・ツリー全体表示

【78366】すみません、説明不足でした
質問  acs  - 16/7/27(水) 13:44 -

引用なし
パスワード
     さっそくの返答ありがとうございます

すみません、かなりの説明不足でした。勝手にQ1、Q2、Q3とさせていただきました

Q1.
【 A1にある写真を削除】とありますが、参考にされたコードでは、貼り付けすべき複数の写真を選択して
それを、A2から下に、選択された複数の写真を貼り付けています。

ということは、「A1にある写真を削除」ではなく、
【シート上のすべての写真を削除】ではないのですか?

Q2.
それと、サイズのことを気にしておられますが、どういったサイズが希望なんですか?
もともとの画像サイズ?
貼り付けるセルの大きさに合わせて縦横比率を維持した縮小サイズ?
それとも?

Q3.
もう1つ。
写真貼り付け順序。参考にされたコードでは、名前順に並び替えたうえで貼り付けていますが
これは必要なんですか?

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

A1.
とあるHPのマクロをそのまま引用させていただいたものでした。
なので本当に必要な作業は、A1に既に張り付けてある写真を削除(無ければスルー)し、新たに選択したものを縮小して張り付けるです(リンクではなく)。
なお、シート上のすべての写真を削除は別のモジュールにて作成済みです。

A2.
サイズは縦横比が保たれた状態で、A1に30%で縮小し、貼り付けたいと思っています。
参照マクロは、セルに合わせていましたので、参照マクロを使用の場合はセルの大きさを変更して使おうかなと思っていました。

A3.
貼り付け順は、なくてもかまわない機能です。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−


Q.参照マクロで写真を貼りつけるとPC1(Win10,2010)だと問題ないのですが
PC2(Win7,2010)はちょっとだけ大きくなり、PC3(Win7,Excel2007)だと横長になってしまいます。これは仕方のないことなのでしょうか?

わがままな質問すみません。
・ツリー全体表示

【78365】Re:特定のセルの写真を削除してから挿入
発言  β  - 16/7/27(水) 12:09 -

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

質問です。

【A1にある写真を削除】とありますが、参考にされたコードでは、貼り付けすべき複数の写真を選択して
それを、A2から下に、選択された複数の写真を貼り付けています。

ということは、「A1にある写真を削除」ではなく、
【シート上のすべての写真を削除】ではないのですか?

それと、サイズのことを気にしておられますが、どういったサイズが希望なんですか?
もともとの画像サイズ?
貼り付けるセルの大きさに合わせて縦横比率を維持した縮小サイズ?
それとも?

もう1つ。
写真貼り付け順序。参考にされたコードでは、名前順に並び替えたうえで貼り付けていますが
これは必要なんですか?
・ツリー全体表示

【78364】特定のセルの写真を削除してから挿入
質問  acs  - 16/7/27(水) 11:43 -

引用なし
パスワード
   初めに長文にて失礼いたします


A1に入っている写真を一旦削除(無ければスルー)してから、写真を選択し縮小してから張り付ける。なお写真はリンクにならないようする。

というようなマクロを作りたいのですがどうしたらよいのでしょうか?

以前、色々なHPなどを見てエクセル2003で作成したのですが、写真を選択し縮小してから張り付けるまではできたのですが、エクセル2010にしたところ、同じフォルダにないと写真が「リンク...」と表示されるようになってしまいました。
さらに違うPCでマクロを動かすと、写真のサイズが微妙に変わってしまうのです。

せっかくなので、
1.A1に写真があれば、一旦削除
2.リンク表示をなくす
の機能を追加して新たに作成ということで今回も様々なHPなどを検索してみたのですが、うまくできませんでした。

(以前のマクロ)
Sub Acespic1()

  Dim FName As String
  Dim myPct As Object
  
  FName = Application.GetOpenFilename(FileFilter:="JPG形式(*.jpg),*.jpg", Title:="ファイルを選択してください")
  
  If FName = "False" Then Exit Sub
  
  Range("A1").Select
  
  Set myPct = ActiveSheet.Pictures.Insert(FName)
    
    
  With myPct.ShapeRange
    .LockAspectRatio = msoTrue
    .Height = 255
    .IncrementTop 3.75
    
    
  End With
  
End Sub


(とあるHPから見つけたマクロ)
複数選択でき、リンク表示もされないため、すごく良かったのですが、削除のマクロを追加したいのと、縮小した写真がぼやけてしまいます。一旦保存して再度開くくと綺麗な写真になるのですが…

丸々の流用なのでとあるHPの回答者様に失礼かもしれませんが、下記の通りです

'図をリンク オブジェクトではなく図として挿入する
'Pictures.Insert メソッドではなく、Shapes.Add メソッドを使用
Sub 複数の画像を挿入01()
Dim strFilter As String
Dim Filenames As Variant
Dim objShape As Shape
Dim i As Integer


' 「ファイルを開く」ダイアログでファイル名を取得
strFilter = "画像ファイル(*.jpg;*.jpeg;*.gif;*.bmp;*.png),*.jpg;*.jpeg;*.gif;*.bmp;*.png"
Filenames = Application.GetOpenFilename( _
FileFilter:=strFilter, _
Title:="図の挿入(複数選択可)", _
MultiSelect:=True)
If Not IsArray(Filenames) Then Exit Sub

' ファイル名をソート
Call BubbleSort_Str(Filenames, True, vbTextCompare)

' 貼り付け開始セルを選択
Range("A2").Select

' マクロ実行中の画面描写を停止
Application.ScreenUpdating = False

' 順番に画像を挿入
For i = LBound(Filenames) To UBound(Filenames)
Set objShape = ActiveSheet.Shapes.AddPicture( _
Filenames(i), False, True, Selection.Left, Selection.Top, 50#, 50#)
'-------------------------------------------------------------
' 画像の各種プロパティ変更
'-------------------------------------------------------------
With objShape
.ScaleHeight 1!, msoTrue
.ScaleWidth 7!, msoTrue
.Height = ActiveCell.MergeArea.Height
.Placement = xlMove ' 移動するがサイズ変更しない
End With
' 次の貼り付け先を選択(アクティブセルにする)[例:2個下のセル]
ActiveCell.Offset(2).Select
Set objShape = Nothing
Next i

' 終了
Application.ScreenUpdating = True
MsgBox UBound(Filenames) & "枚の画像を挿入しました", vbInformation
End Sub

' バブルソート(文字列) 'ORIGINAL
Private Sub BubbleSort_Str( _
ByRef Source As Variant, _
Optional ByVal SortAsc As Boolean = True, _
Optional ByVal Compare As VbCompareMethod = vbTextCompare)

If Not IsArray(Source) Then Exit Sub

Dim i As Long, j As Long
Dim vntTmp As Variant
For i = LBound(Source) To UBound(Source) - 1
For j = LBound(Source) To LBound(Source) + UBound(Source) - i - 1
If StrComp(Source(IIf(SortAsc, j, j + 1)), _
Source(IIf(SortAsc, j + 1, j)), Compare) = 1 Then
vntTmp = Source(j)
Source(j) = Source(j + 1)
Source(j + 1) = vntTmp
End If
Next j
Next i

End Sub
・ツリー全体表示

【78363】Re:解決しました
発言  γ  - 16/7/25(月) 21:10 -

引用なし
パスワード
   こんにちは。
解決されたようで何よりです。
また解決を知らせてくれたのは、good jobです。


ところで、
こちらでマナさんがいくつかのステップに分けて、
トライしやすいように助言されていたのですが、
なぜそれにトライされようとしなかったのでしょうか。

マナさんはもちろん正解は瞬時に分かったわけで、
あなたが理解し易いように、小分けにして回答してくださったいたのです。

特に、16/7/23(土) 9:46 の助言は、内容の理解に有益なものでした。
それに沿って考えを進めていけば、答えに到達できたはずです。

Like演算子の理解につながる適切な例も示されています。
>3)の例です。理解できますか。
と問いかけられていますが、なぜそれに応えられなかったのでしょう。

VBAを学習しようとしているのではないのですか。
単にコードが欲しいだけですか?
ご自分で取り組もうという気はまったくないのですか?
残念なことです。


ちなみに、知恵袋での回答をそのまま転記されているが、
それはそれで動作はしますが、ちょっと疑問もあります。

(1)コードは普通はきちんとインデントをつけるものです。
  知恵袋ではインデントが崩れやすいのでやむを得ない面もあるが、
  実際に使う場合や、他に転用するなら、
  きちんとインデントをつけるべきですね。
 
(2)逆順にしないといけないのは、数値によるindexでコレクションを参照しているからで、
  質問にあった(これはマナさんの回答をそのまま転用しているのですが)
  For Each ..Nextをそのまま使えば、逆順など意識する必要はありません。

(3)ついでに、知恵袋での別の回答について言えば、
  If InStr(Workbooks(i).Name, KeyWord) > -1 Then
    Workbooks(i).Close
  End If 
  も回答者に勘違いがあります。
  これでは、すべてのブックが閉じられるはずです。
  keywordを含まない場合はInStrは 0 を返すのです。
  > 0 とすべきところを確認を怠ったのでしょう。

ということで、
Sub test()
  Dim wb As Workbook
  Dim keyword As String

  keyword = "pon"
  For Each wb In Workbooks
    If wb.Name Like "*" & keyword & "*" Then
      wb.Close
    End If
  Next
End Sub
で良いでしょう。

マナさんの助言に単に .closeを足すだけですよ。
他人の助言をしっかり受け止めて下さい。
単にコードだけ欲しがるのではなく。
・ツリー全体表示

【78362】解決しました
発言  ぽん  - 16/7/24(日) 23:40 -

引用なし
パスワード
   Sub test()
Dim i As Integer
Dim keyword As String

keyword = "pon"
For i = Workbooks.Count To 1 Step -1
MsgBox Workbooks(i).Name
If Workbooks(i).Name Like "*" & keyword & "*" Then
Workbooks(i).Close
End If
Next

End Sub
・ツリー全体表示

【78361】Re:特定のキーワードを含むファイルだけ...
発言  純子 E-MAIL  - 16/7/24(日) 20:16 -

引用なし
パスワード
   ▼ぽん さん:
>質問させていただきます。
>マクロ初心者です。
>
>特定キーワードをファイル名に含むファイルだけ全て閉じるようにしたいです。
>どうすればよいでしょうか?
>
>よろしくお願いいたします。

お疲れ様です。

まず最初に
ファイルの全名称取得を考えましょう。

Do 〜 Loopでできます
・ツリー全体表示

【78360】Re:特定のキーワードを含むファイルだけ...
発言  とおりすがり  - 16/7/24(日) 10:32 -

引用なし
パスワード
   参考まで。

ht tp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12161996877
・ツリー全体表示

【78359】Re:隣同士のセルの文字を判定してカウン...
発言  マナ  - 16/7/24(日) 9:43 -

引用なし
パスワード
   ものすごく短い式でした。ちょっとした衝撃です。
その分、身についた感があります。
・ツリー全体表示

【78358】Re:隣同士のセルの文字を判定してカウン...
回答  sy  - 16/7/24(日) 9:06 -

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

Excel2007以降なら、
=COUNTIFS(B2:AE2,"中",C2:AF2,"早")

Excel2003以前でも使う可能性があるなら、
=SUMPRODUCT((B2:AE2="中")*(C2:AF2="早"))

で求められます。

ここはVBAの掲示板なので、関数で解決したいなら一般操作の質問を専門で扱ってる掲示板で聞く方が回答は早いですよ。
・ツリー全体表示

【78357】Re:隣同士のセルの文字を判定してカウン...
発言  マナ  - 16/7/23(土) 20:31 -

引用なし
パスワード
   >ものすごく長い式

↓のような作業の数式化をイメージしています。

Sub test()
  Dim r As Range
  Dim s1 As String
  Dim s2 As String
  
  Set r = Range("B2").Resize(, 31)
  
  s1 = Join(Application.Transpose(Application.Transpose(r)))
  s2 = Replace(s1, "中 早", "中 ")
  
  MsgBox Len(s1) - Len(s2)
  
End Sub
・ツリー全体表示

【78356】Re:隣同士のセルの文字を判定してカウン...
発言  マナ  - 16/7/23(土) 20:08 -

引用なし
パスワード
   ▼たか さん:
関数で可能だと思います。
わたしは関数が得意ではありませんので、
ものすごく長い式になっちゃいますが、
適切な掲示板で質問されると、すぐに解決するでしょう。
・ツリー全体表示

【78355】隣同士のセルの文字を判定してカウントし...
質問  たか  - 16/7/23(土) 19:50 -

引用なし
パスワード
   勤務シフト表をexcelで作成しています。
縦軸に名前、横軸に1〜31日までの日付をとり、「夜」「早」「中」「休」など勤務記号が入っています。

例えばAさんの2日の勤務が「中」の場合、翌日の勤務が「早」ならば1カウント、
「早」以外の記号ならばノーカウントとして
Aさんのひと月の勤務内で「中」→「早」の流れが何回あるか計算したいのですが、関数で可能でしょうか?

それともユーザー定義関数を作成しないとできないでしょうか?
・ツリー全体表示

【78354】Re:特定のキーワードを含むファイルだけ...
発言  マナ  - 16/7/23(土) 9:46 -

引用なし
パスワード
   ▼ぽん さん:
作業を分解して考えるようにするとよいです。

1)ファイル名を取得するマクロ
2)ファイルを閉じるマクロ
3)ファイル名に特定の文字列が含まれるかどうか判定するマクロ
4)現在、開いている全てのファイルについて処理するマクロ

上記のマクロを組み合わせるとできます。
3)の例です。理解できますか。

Sub test2()
  Dim fn As String
  Dim keyword As String
  
  fn = ThisWorkbook.Name
  keyword = "Book"

  If fn Like "*" & keyword & "*" Then
    MsgBox fn & "には、キーワードが含まれています"
  Else
    MsgBox fn & "には、キーワードは含まれていません"
  End If

End Sub
・ツリー全体表示

【78353】Re:特定のキーワードを含むファイルだけ...
発言  ぽん  - 16/7/23(土) 5:12 -

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

教えていただいたとおり実行してみたところ、
開いているファイルが表示されました。
この内、どうすれば一部キーワードを含むものだけ閉じれるのか分かりません。

ヒントをいただけないでしょうか?
・ツリー全体表示

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