Excel VBA質問箱 IV

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

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


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

【80128】Re:条件分岐の使い方
発言  マナ  - 18/8/31(金) 20:34 -

引用なし
パスワード
   ▼ノンボ さん:

>セルを削除しますとフォーマットがくずれてしまいうまくありません。

行全体を削除ですが、それでもだめなのですか?
・ツリー全体表示

【80127】Re:条件分岐の使い方
お礼  ノンボ E-MAIL  - 18/8/31(金) 20:23 -

引用なし
パスワード
   ▼マナ さん:
>▼ノンボ さん:
>
>こんな方法のほうが単純でよいのでは?
>
>1)ジャンプ機能でB列が空白セルを選択
>2)選択セルを行削除
>
> 
さっそくご返答いただきましてありがとうございます。
セルを削除しますとフォーマットがくずれてしまいうまくありません。
ほかの方法がありませんでしょうか?
・ツリー全体表示

【80126】Re:条件分岐の使い方
発言  マナ  - 18/8/30(木) 22:01 -

引用なし
パスワード
   ▼ノンボ さん:

こんな方法のほうが単純でよいのでは?

1)ジャンプ機能でB列が空白セルを選択
2)選択セルを行削除

 
・ツリー全体表示

【80125】条件分岐の使い方
質問  ノンボ E-MAIL  - 18/8/30(木) 21:25 -

引用なし
パスワード
    お世話になります。

 VBAのスキルがまだ拙いです。

 下記データがあります。

A列店舗コード B列口座コード C列売上金額

 100235     001       1,100
 100332     002       1,300
 100342     003       1,500
 100442     004       1,700
 100534     005       1,800
 100425     006       2,000
 100567     007       1,900
 100781     008       2,100

条件1 1行目のタイトル行(店舗コードなど)と2行目B列が空白の場合3行目以     降のデータをコピーして繰り上げます。
条件2 1行目のタイトル行と2行目B列が空白でない場合、3行め以降のデータは     そのままにしたいのです。
下記ソースコードを記入しました。

 Sub Test()
  Dim i As Integer, j As Integer
  j = 1
  For i = 2 To 10
    If (Range("B" & i).Rows <> "") Then
      j = j + 1
      Rows(i).Copy Rows(j)
      Rows(i) = ""
    End If
  Next i
End Sub

 条件1はうまくいくのですが、条件2ですとデータが削除されてしまいます。
  Exit for などいくつか試みてみましたがうまくいきません。どのようなコード を書けばよろしいでしょうか、ご教授ねがえればと思いまして投稿しました。
  よろしくお願いします。
・ツリー全体表示

【80124】Re:型宣言の場所
お礼  そば  - 18/8/28(火) 5:34 -

引用なし
パスワード
   亀マスターさん、ご回答ありがとうございます。

そうなのですね。理解しました。
・ツリー全体表示

【80123】Re:型宣言の場所
質問  そば  - 18/8/28(火) 5:33 -

引用なし
パスワード
   よろずやさん、ご回答ありがとうございます。

>のスペルは同じですか?

質問箱のコードは、
実際のコードをコピペしてきたものです。
そしてこれが全てです。

それとも、これだけでは足りなくて
エラーになっているのでしょうか?
・ツリー全体表示

【80122】Re:型宣言の場所
発言  亀マスター  - 18/8/26(日) 21:42 -

引用なし
パスワード
   >また、
>End Type
>
>Function AAA()
>の間に、細長い横線が入ってますが、
>何か関係ありますでしょうか。

横線はプロシージャ(SubやFunctionのひとかたまり)ごとの間に目印として入るもので、今回の件には関係ないでしょう。邪魔ならオプションから消すことも出来ます。
・ツリー全体表示

【80121】Re:型宣言の場所
発言  よろずや  - 18/8/26(日) 19:43 -

引用なし
パスワード
   >Private Type POINTAPI

>  Dim p As POINTAPI
のスペルは同じですか?
質問箱の方ではなく、実際にエラーになったコードを確認してください。
・ツリー全体表示

【80120】型宣言の場所
質問  そば  - 18/8/26(日) 16:20 -

引用なし
パスワード
   こんにちは。
VBA素人です。

以下のような簡単なコードを書いてみたところ、
"コンパイルエラー
ユーザ定義型は定義されてません"
というエラーメッセージが出てしまいました。

////////////////////////

Private Type POINTAPI
   x As Long
   y As Long
End Type

Function AAA()
  Dim p As POINTAPI
  
  p.x = 1
  p.y = 2
  
  Range("F1").Value = p.x
  Range("G1").Value = p.y
End Function

//////////////////////

なにか文法上の問題があるのでしょうか。
それとも型宣言の場所に問題があるのでしょうか。
また、
End Type

Function AAA()
の間に、細長い横線が入ってますが、
何か関係ありますでしょうか。


分かる方いらっしゃったら、よろしくお願いします。
・ツリー全体表示

【80119】Re:特定セル範囲のダブルクリックマクロ
お礼  猫の毛だらけ  - 18/8/19(日) 21:20 -

引用なし
パスワード
   マナ様
校正、添削ありがとうございました。
お手数おかけしました。

過去に書いてきたコードの半分ほども無用な文字の羅列だった気がします。
これからは、動作するコードでも文法を練りなおしてスマートに記述できるよう勉強します。
・ツリー全体表示

【80118】Re:フルパスの受け渡し
発言  マナ  - 18/8/18(土) 8:55 -

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

>この方法の具体的なコードって
>宜しければ教えてもらえませんか?

↓のモジュールレベル変数
ht tp://officetanaka.net/excel/vba/variable/05.htm
・ツリー全体表示

【80117】Re:フルパスの受け渡し
発言  Image  - 18/8/17(金) 23:07 -

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

なるほど〜
セルに書き出してクリア
そういう方法もありますね。

> Dim FileType As String

を、プロシージャの外にだせばよいのではありませんか。

この方法の具体的なコードって
宜しければ教えてもらえませんか?
・ツリー全体表示

【80116】Re:フルパスの受け渡し
発言  マナ  - 18/8/17(金) 21:18 -

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

>下記のコードで、画像ファイルのフルパスをセルに書き出さずに
>フルパスを受け取りたいのですが、どのように直せば良いか教えて下さい。

> Dim FileType As String

を、プロシージャの外にだせばよいのではありませんか。

あるいは、いったんセルに書き出すとしても、
フルパスを受け取ったあとで、最後にクリアするとか。
・ツリー全体表示

【80115】フルパスの受け渡し
質問  Image  - 18/8/17(金) 19:39 -

引用なし
パスワード
   フォーム上のイメージコントロールに画像を表示し、
その画像で良ければ、OKボタンを押してセルに張付けたい。

下記のコードで、画像ファイルのフルパスをセルに書き出さずに
フルパスを受け取りたいのですが、どのように直せば良いか教えて下さい。


以下、コード。

画像をファイルから選択し、Image1に表示。----------------------------------------------------
Sub CommandButton1_Click

 Dim FileType As String
 Dim Dialog As String
 Dim Filename As Variant

 FileType = "画像ファイル (*.jpg;*.gif;*.png),*.jpg;*.gif;*.png," _
      & "JPEG 形式 (*.jpg),*.jpg," _
      & "GIF 形式 (*.gif),*.gif," _
      & "PNG 形式 (*.png),*.png"

 Dialog = "画像ファイルの選択"
 Filename = Application.GetOpenFilename(FileType, , Dialog)

 If Filename <> False Then
  Image1.Picture = LoadPicture(Filename)
 Else
  Image1.Picture = LoadPicture("")
 End If

End Sub

Image1の画像で良ければ、セルに貼付け。------------------------------------------------------

CommandButton2_Click

 Dim Filename As Variant
 Dim Shape As Variant
 Dim MovCell As Range
 Dim MovLeft As Double
 Dim MovTop As Double
 Dim MovHeight As Double
 Dim MovWidth As Double

 If Filename <> False Then
  For Each Shape In Worksheets("Sheet1").DrawingObjects
   If Not Intersect(Shape.TopLeftCell, Worksheets("Sheet1"). _
            Range("F10:I21")) Is Nothing Then
    Shape.Delete
   End If
  Next

  Worksheets("Sheet1").Range("F10:I21").Value = Dir(Filename)
  
  With Worksheets("Sheet1").Range("F10:I21")
   MovLeft = .Left
   MovTop = .Top
   MovHeight = .Cells(.Count).Offset(1).Top - .Top
   MovWidth = .Cells(.Count).Offset(, 1).Left - .Left
  End With

  With Worksheets("Sheet1").Shapes.AddPicture(Filename:=Filename, LinkToFile:=False, _
                        SaveWithDocument:=True, Left:=Selection.Left, _
                        Top:=Selection.Top, Width:=0, Height:=0)
  End With

  With Worksheets("Sheet1").Pictures(Worksheets("Sheet1").Pictures.Count).ShapeRange
   .LockAspectRatio = msoFalse
   .Parent.Visible = msoTrue
   .Left = MovLeft
   .Top = MovTop
   .Height = MovHeight
   .Width = MovWidth
   .Line.Visible = msoTrue
   .Line.Style = msoLineSingle
   .Line.ForeColor.RGB = RGB(0, 0, 0)
   .Line.Weight = 1.5
   .Name = Dir(Filename)
  End With

 Else
  For Each Shape In Worksheets("Sheet1").DrawingObjects
   If Not Intersect(Shape.TopLeftCell, Worksheets("Sheet1"). _
            Range("F10:I21")) Is Nothing Then
    End
   End If
  Next

  Worksheets("Sheet1").Range("F10:I21").Value = "ファイルが選択されていません。"

 End If
・ツリー全体表示

【80114】Re:特定セル範囲のダブルクリックマクロ
発言  マナ  - 18/8/17(金) 19:02 -

引用なし
パスワード
   ▼猫の毛だらけ さん:

>Dim myTarget As Range

↑は不要です。

'-----

"good"でも"error"でも、Cancelするなら
最後または最初に、Cancel = True を記述すればよいです。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

 If Not Application.Intersect(Target, Range("A1:C1")) Is Nothing Then
   MsgBox "good"
 Else
   MsgBox "error" 
 End If

 Cancel = True

End Sub

'-----


>Set myTarget = Application.Intersect(Target, Range("A1:C1"))
> If myTarget Is Nothing Then
   Exit Sub
> End If

↑最初の質問文のコードのように、
A1:A3以外のときは、なにもしないで終了し
通常のダブルクリック処理をしたいなら、


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

 If Application.Intersect(Target, Range("A1:C1")) Is Nothing Then
  Exit Sub
 End If
 
 Cancel = True
 'A1:C3をダブルクリックで実行することを以下に記述
 MsgBox "good"

End Sub

'-----
 
> Else:

↑の:は不要です。

>Else: MsgBox "error"

↑は、1行で記述しているので必要だっただけです。
・ツリー全体表示

【80113】Re:特定セル範囲のダブルクリックマクロ
お礼  猫の毛だらけ  - 18/8/16(木) 23:20 -

引用なし
パスワード
   マナ様
ご指摘ありがとうございました。

下記のように修正しました。
Cancel = Trueの意味が分からず、記述場所も?でしたが
イベントのキャンセル(=今回はダブルクリック後のセルの編集状態解除)
と考えてよろしいでしょうか?

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim myTarget As Range

 If Not Application.Intersect(Target, Range("A1:C1")) Is Nothing Then
   MsgBox "good"
   Cancel = True
  
 Else:
   MsgBox "error"
   Cancel = True
 End If
 
End Sub
・ツリー全体表示

【80112】Re:特定セル範囲のダブルクリックマクロ
発言  マナ  - 18/8/16(木) 18:31 -

引用なし
パスワード
   ▼猫の毛だらけ さん:

> myC = Split(Selection.Address, "$")(1) '列アルファベット選択

間違いではありませんが、Targetを使えばよいと思います。
myC = Split(Target.Address, "$")(1)

ただ、myC も myR も必要ないのに、なぜ?
myTargetについても、

If Application.Intersect(Target, Range("A1:C1")) Is Nothing Then

とすれば変数を使わなくてもよいです。

あと、必要に応じて
Cancel=True
を追加するとよいと思いました。


 
・ツリー全体表示

【80111】Re:エクセル上からアクセルファイルに読...
お礼  みかん  - 18/8/16(木) 17:40 -

引用なし
パスワード
   よろずやさん

ありがとうございます。

ADOではパスワードを付けて保存する方法はなく、DAOのみ方法があるが、
事前に参照設定の必要がある。ってことですね。

たすかりました。ありがとうございました。
・ツリー全体表示

【80110】Re:特定セル範囲のダブルクリックマクロ
発言  猫の毛だらけ  - 18/8/16(木) 13:56 -

引用なし
パスワード
   マナ様
ご指摘ありがとうございます。
下記のように書き換えてみました。

矛盾点があればお教えください。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim myTarget As Range
Dim myC As String, myR As Long
myC = Split(Selection.Address, "$")(1) '列アルファベット選択
myR = 1

Set myTarget = Application.Intersect(Target, Range("A1:C1"))
 If myTarget Is Nothing Then
   MsgBox "error"
 Else:
   MsgBox "good"
 End If
End Sub
・ツリー全体表示

【80109】Re:特定セル範囲のダブルクリックマクロ
発言  マナ  - 18/8/16(木) 13:05 -

引用なし
パスワード
   ▼猫の毛だらけ さん:

それで納得できたのですか?

>ブレークポイントを置いて
> If Target.Address =
>にカーソルを持っていくと"$A$1"とか表示されても
>実際には対応していないのですね。

そうではなくて、カーソルは、右辺のmyCにあてて確認してください。

>Dim myC As String, myR As String
>myC = Selection.Column

Stringではなく Longです

>セルA1、B1、C1のどれかをダブルクリックすると
>goodのメッセージが表示されるようにコードを書いたつもりですが

そういうことであれば、

>If myTarget Is Nothing Then

Nothingでなければ goodでよいのでは?
・ツリー全体表示

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