Excel VBA質問箱 IV

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

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


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

【78608】Re:VLOOKUPを使いたい
発言  β  - 16/11/28(月) 12:51 -

引用なし
パスワード
   ▼もよもと さん:

γさんから

>>なお、そのつど全文引用するのはやめてください。
>>無駄に長くなります。 

というアドバイスがあるのに、それでも全文引用 ?

まぁ、それはさておき

>エラー値を表示せずに、メッセージ表示してTargetを消すような動作は
>できないでしょうか。

最初のApplication.VLookUp の結果を セル直接 ではなく Variant型の変数で受けます。

で、

If IsError(その変数) Then
  MsgBox "該当値がありません。" & vblf & "入力を元に戻します"
  Application.Undo
  Application.EnableEvents = True
  Exit Sub
Else
  その変数を目的のセルにセット
 2番目以降のVLookUp 等 現在のコード
End If

といったようにされるといいと思います。
ただ、一括複数入力時、ループ処理をされていますよね。
そうした場合、仮に、マッチする入力があって、そのあとにマッチしないものがあった場合は
UnDo で不具合が発生します。

ですから、ちょっとコード的には悩ましいところがありますね。
(手当て方法はありますが)

>MatchとIndexを組み合わせる方法がいまいちよく分からない

シート関数のMATCHの使い方はおわかりですよね。

Variant型変数 = Application.Match(・・・・)
If IsError(その変数) Then
  MsgBox "該当値がありません。" & vblf & "入力を元に戻します"
  Application.Undo
  Application.EnableEvents = True
  Exit Sub
Else
  3行目から200行目の領域の中の 変数が示す位置(変数+2 行目), の
  C,D,E列の値を目的のセルにセット
End If

こんな感じです。
ただし、一括複数入力時の課題は同じものがありますが。
・ツリー全体表示

【78607】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/28(月) 10:10 -

引用なし
パスワード
   ▼γ さん:
>Application.WorksheetFunction.Lookup と On Error Go To を組み合わせても可能ですが、
>Application.Lookupとすると、エラーにならず、エラー値だけが返されます。
>これを利用するとよいでしょう。
>
>↓を参照してください。
>ht tps://www.moug.net/tech/exvba/0100035.html
>
>なお、この場合、なんどもVLOOKUPで検索するのは無駄になりますので、
>一度だけMatch関数で位置を調べ、
>あとはIndex関数を使うか、直接、行番号を使ってセルの値を取り出すのが
>効率的でしょう。
>
>なお、そのつど全文引用するのはやめてください。
>無駄に長くなります。 

γさん:
エラー値を表示せずに、メッセージ表示してTargetを消すような動作は
できないでしょうか。
また、MatchとIndexを組み合わせる方法がいまいちよく分からないので
併せて教えて頂けると幸いです。
・ツリー全体表示

【78606】Re:TextBoxになるべく大きく文字を書くに...
回答  りった  - 16/11/28(月) 9:58 -

引用なし
パスワード
   やはりプロポーショナルふぉrンとだと厳しいですか。
あきらめて目視で調整します。
回答ありがとうございます。
・ツリー全体表示

【78605】Re:VLOOKUPを使いたい
発言  γ  - 16/11/28(月) 7:35 -

引用なし
パスワード
   Application.WorksheetFunction.Lookup と On Error Go To を組み合わせても可能ですが、
Application.Lookupとすると、エラーにならず、エラー値だけが返されます。
これを利用するとよいでしょう。

↓を参照してください。
ht tps://www.moug.net/tech/exvba/0100035.html

なお、この場合、なんどもVLOOKUPで検索するのは無駄になりますので、
一度だけMatch関数で位置を調べ、
あとはIndex関数を使うか、直接、行番号を使ってセルの値を取り出すのが
効率的でしょう。

なお、そのつど全文引用するのはやめてください。
無駄に長くなります。          
・ツリー全体表示

【78604】Re:VLOOKUPを使いたい
質問  もよもと  - 16/11/28(月) 0:57 -

引用なし
パスワード
   ▼もよもと さん:
>▼佳 さん:
>>こんにちは。
>>
>>なんか、あぶなっかしいですね。
>>VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
>>してしまいそうな不安があります。
>>
>>入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
>>保護を掛けてある)を別にするのはどうですか。
>>
>>
>>▼もよもと さん:
>>>▼β さん:
>>>>▼もよもと さん:
>>>>
>>>>横から失礼します。
>>>>
>>>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>>>
>>>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>>>エクセル利用の常道だと思いますが?
>>>>
>>>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>>>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>>>
>>>
>>>βさん
>>>
>>>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>>>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。
>
>佳さん
>
>その手もアリですね。
>トライしてみます。

下記のコードでなんとかイメージ通りに出来ましたが、
エラー回避のためにOn Error Gotoを入れると、エラーで
ないものまでエラー判定されてしまい、困っています。
どうしたら、よろしいでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rng As Range
  Dim r  As Range
  Set rng = Intersect(Target, Range("$E$8:$E$200"))
  If Not rng Is Nothing Then
  Application.EnableEvents = False
    For Each r In rng
      If r.Value <> "" Then
        r.Offset(, 2).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 2, False)
        r.Offset(, 3).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 3, False)
        r.Offset(, 4).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 4, False)
      Else
        r.Offset(, 2).ClearContents
        r.Offset(, 3).ClearContents
        r.Offset(, 4).ClearContents
      End If
    Next
    Application.EnableEvents = True
    Set rng = Nothing
  End If
End Sub
・ツリー全体表示

【78603】Re:TextBoxになるべく大きく文字を書くに...
発言  亀マスター  - 16/11/25(金) 19:53 -

引用なし
パスワード
   テキストボックスのWidthプロパティ、Heightプロパティはポイント単位でサイズの設定・取得ができ、文字のフォントサイズもポイントサイズで表すので、これを利用すればなんとかなるような気はします。たとえば、Widthが100で文字数が20字なら、フォントサイズを5に設定するとか。ただし、フォントの名前にPが入っているもの(MS Pゴシックなど)は文字ごとに横幅が変わるので、Pのついていないもの限定ですが。

高さに関しては1行の高さが具体的に何ポイントなのか取得・設定がしにくいので、私はよくわかりませんでした。
一応、
テキストボックス.ShapeRange.TextFrame2.TextRange.ParagraphFormat.SpaceWithin
で行間を取得できるのですが、設定が「1行」「2行」のようになっていれば1、2となり、固定値で10ptとなっていれば10となるので、正確に高さを取得できないのです。(できるのかもしれませんがわかりませんでした。)
また、手元で試してみたところ、固定値で高さ145ptで余白0cm、線のサイズ0ptのテキストボックスに、フォントサイズ70ptの字が2行入りませんでした。
・ツリー全体表示

【78602】Re:TextBoxになるべく大きく文字を書くに...
発言  りった  - 16/11/25(金) 18:02 -

引用なし
パスワード
   補足です。
ちなみにテキストは複数行折り返しです。
・ツリー全体表示

【78601】TextBoxになるべく大きく文字を書くには
質問  りった  - 16/11/25(金) 17:52 -

引用なし
パスワード
   固定サイズのTextBoxにマクロでテキストを設定します。
表示しきれなかったらフォントサイズを小さくしたいのですが、
何かいい方法有りますでしょうか?

背景:
・マクロでテキストを設定することは出来ます。
・無条件にフォントサイズを変更することも出来ます。
・「いい感じに」フォントサイズを変更する方法が分かりません。

実際に今作っているのはパワーポイントマクロなのですが、
こちらの掲示板はいつも的確な回答を頂けるのと、
後々Excel VBAでも同じことで困るかもしれないので
質問させて頂きました。
Excel VBAの質問としてのご回答頂ければ幸いです。
・ツリー全体表示

【78600】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/24(木) 15:05 -

引用なし
パスワード
   ▼佳 さん:
>こんにちは。
>
>なんか、あぶなっかしいですね。
>VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
>してしまいそうな不安があります。
>
>入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
>保護を掛けてある)を別にするのはどうですか。
>
>
>▼もよもと さん:
>>▼β さん:
>>>▼もよもと さん:
>>>
>>>横から失礼します。
>>>
>>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>>
>>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>>エクセル利用の常道だと思いますが?
>>>
>>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>>
>>
>>βさん
>>
>>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。

佳さん

その手もアリですね。
トライしてみます。
・ツリー全体表示

【78599】Re:VLOOKUPを使いたい
発言    - 16/11/24(木) 13:54 -

引用なし
パスワード
   こんにちは。

なんか、あぶなっかしいですね。
VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
してしまいそうな不安があります。

入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
保護を掛けてある)を別にするのはどうですか。


▼もよもと さん:
>▼β さん:
>>▼もよもと さん:
>>
>>横から失礼します。
>>
>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>
>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>エクセル利用の常道だと思いますが?
>>
>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>
>
>βさん
>
>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。
・ツリー全体表示

【78598】Re:VLOOKUPを使いたい
発言  もよもと  - 16/11/24(木) 12:33 -

引用なし
パスワード
   ▼β さん:
>▼もよもと さん:
>
>横から失礼します。
>
>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>
>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>エクセル利用の常道だと思いますが?
>
>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)


βさん

関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。
・ツリー全体表示

【78597】Re:VLOOKUPを使いたい
発言  β  - 16/11/24(木) 10:43 -

引用なし
パスワード
   ▼もよもと さん:

横から失礼します。

>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。

変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
エクセル利用の常道だと思いますが?

(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
 あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
・ツリー全体表示

【78596】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/24(木) 7:35 -

引用なし
パスワード
   ▼γ さん:
>▼もよもと さん:
>>予め全てのセルに関数を入れるのは
>>手間が掛かるからです。
>=IF(B1="","",IFERROR(VLOOKUP(・・・・),"該当なし"))
>などとしておけば、一括してコピーペイストが可能。
>手動入力の場合は式に上書きする、
>ということでよいと思いますが、いかがですか?
>
>どうしてもVBAということなら、具体的に詰まっている点はどこですか?
>
>ワークシート関数をVBA内で使用する方法ですか?
>WorksheetFunction.VLookupのように頭にWorksheetFunctionをつければいいです。
>
>B列に入力した瞬間に計算させたいということなら
>Changeイベントプロシージャを使います。
>www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change
>を参考にして下さい。
>(頭のht・・・を省略しています。この質問掲示板のセキュリティ対策上の関係です)
>
>以上の情報をもとにご自分でトライしてみてください。
>詰まったらまた質問して下さい。
>(私は日中はこちらに来ませんが、ほかのかたから支援があるはずです。)
> 
γさん

早速、ご回答頂き有難うございます。
VBAにこだわるのは、作業者に関数をいじられたくない
からです。管理上、コピペ禁止しており、万一手動入力後に取り消ししようとして、関数を消されるとマズイので。また、動作も遅くなることも懸念してます。
まずは教えて頂いた方法でトライしてみます。
・ツリー全体表示

【78595】Re:VLOOKUPを使いたい
発言  γ  - 16/11/24(木) 7:17 -

引用なし
パスワード
   ▼もよもと さん:
>予め全てのセルに関数を入れるのは
>手間が掛かるからです。
=IF(B1="","",IFERROR(VLOOKUP(・・・・),"該当なし"))
などとしておけば、一括してコピーペイストが可能。
手動入力の場合は式に上書きする、
ということでよいと思いますが、いかがですか?

どうしてもVBAということなら、具体的に詰まっている点はどこですか?

ワークシート関数をVBA内で使用する方法ですか?
WorksheetFunction.VLookupのように頭にWorksheetFunctionをつければいいです。

B列に入力した瞬間に計算させたいということなら
Changeイベントプロシージャを使います。
www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change
を参考にして下さい。
(頭のht・・・を省略しています。この質問掲示板のセキュリティ対策上の関係です)

以上の情報をもとにご自分でトライしてみてください。
詰まったらまた質問して下さい。
(私は日中はこちらに来ませんが、ほかのかたから支援があるはずです。)
 
・ツリー全体表示

【78594】Re:VLOOKUPを使いたい
発言  もよもと  - 16/11/24(木) 5:57 -

引用なし
パスワード
   はい、VBAでやりたいです。
B列に必ず値を入れるわけではなく、
入れないで他の列に手動で入れる場合も
あり、予め全てのセルに関数を入れるのは
手間が掛かるからです。
・ツリー全体表示

【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を入力していけば良い気がします。
・ツリー全体表示

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