Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2013)
連続入力の手間を減らす方法
投稿日時: 18/03/31 21:38:35
投稿者: UUU

あるセルに入力すると、同じ行の他のセルには直前のセルの値をコピーするようなVBAは
どのように記述したらよいでしょうか?
 
文章では伝えられそうにないので、画像をアップしました
よろしかったら、みてください
 
https://i.imgur.com/6hYNJ0T.jpg

回答
投稿日時: 18/03/31 23:17:45
投稿者: simple

掲示板ご利用上のお願い さんの引用:
禁止事項
ファイルを直接ダウンロードさせる
ファイルを直接リンクするURL、および同様のファイルをダウンロードさせることを目的としたフォルダやディレクトリ、サイトへのURLを、Q&A掲示板の発言内に記載することはご遠慮ください。
 一般操作の説明は、操作方法または数式を記載し、マクロに関してはVBAコードを記載するようにしてください。

ということなので、文章で説明してください。

回答
投稿日時: 18/04/01 07:16:24
投稿者: simple

     A列    B     C     D      E
1
2
3
のような形式でレイアウトを示した上で、
・どのような時に、
・どのような動作をさせたいか
を説明して下さい。

回答
投稿日時: 18/04/01 12:09:53
投稿者: もこな2

リンク先を見ていないのでわかりませんが、真面目な質問だとしたら、changeイベントについて調べてみるとよいかもしれません。

投稿日時: 18/04/01 16:28:45
投稿者: UUU

画像程度ならいいと思いましたが、ここではだめなんですね
改めて文章で質問します
 
 日付 担当者ID 個数 金額
1 1/1 1     100  10000
2
 
とあるとき、個数に何かを入力したら
2行目の日付には直前の日付、担当者IDのも直前の値
金額には個数×100
フォントや配色なども同じにしたいです
また、個数の修正時には、金額のみが上書きされるようにしたです
 
オートフィルではなく値や計算式を挿入したいです
オートフィルではコピペや並べ替えやピポッドテーブルのときにずれることがあるので
それを考慮してのことです
また。オートフィルでは最終行に来るたびに適宜ドラッグする必要があるのも手間です

回答
投稿日時: 18/04/01 17:24:12
投稿者: mattuwan44

                                                                                         
                                                     ↓手入力 ↓個数*100     
┌─────────────────────┬────┬────┬─────┐    
│日付                                      │担当者ID│個数    │金額      │    
├─────────────────────┼────┼────┼─────┤    
│2018/3/31                                 │1       │100     │10000     │    
├─────────────────────┼────┼────┼─────┤    
│2018/3/31                                 │1       │50      │5000      │    
├─────────────────────┼────┼────┼─────┤    
│2018/3/31                                 │2       │10      │1000      │    
├─────────────────────┼────┼────┼─────┤    
│2018/3/31                                 │2       │20      │2000      │    
├─────────────────────┼────┼────┼─────┤    
│2018/4/1                                  │1       │1       │100       │    
├─────────────────────┼────┼────┼─────┤    
│                                          │        │※      │          │    
└─────────────────────┴────┴────┴─────┘    
                                                                             
                                           
 ↑個数に何か入力されたら、直前の日付セルと同じ値を入力                            
                                           
 個数を修正しても再入力しない                                                      
                                           
 ※に個数を入力すると、                                                            
                                           
                                                                             
┌─────────────────────┬────┬────┬─────┐    
│2018/4/1                                  │1       │100     │10000     │    
└─────────────────────┴────┴────┴─────┘    
                                                                             
                                           
 となるようにしたいです。できれば書式というか、フォントやいろ継承させたいです    
                                           
 オートフィルではなく、値を計算式を挿入させたいですトートフィルでは=A1などの       
                                           
 値になるので並べ替えやピボットテーブルで                                           
                                           
 おかしくなったことがあるので正確性を考慮してのことです                             
                                           
 また、オートフィルだと最終行にくるたびにドラッグする必要があるのも手間がかかっ     
                                           
 ています                                                                           
                                                                                           
  
 
↑一応画像の内容です。
 
>>UUUさん
ファイルやサイトに誘導するのはUUUさんに悪意があるかないかわからないので、
見てもらえる可能性がかなり減ります。
画像がここに添付できれば良いのでしょうが、
どうしてもウィルスが紛れ込んでいないという保証はないので、
大変と思いますが文字だけで説明していただけないでしょうか?
たぶんそのほうが質問者にとって利益が大きいです。
 
逆にこちらは、サイトへのリンクを貼らせていただきますが。。。
文字よりもやはり画像付きのほうがわかりやすいと思うためです。
 
まず、エクセルの表を文字列に変換するフリーソフトを紹介します。
http://www.itmedia.co.jp/bizid/articles/1010/25/news030.html
https://software.opensquare.net/relaxtools/archives/524/
 
===============================================
で、本題。
 
僕ならこういう場合、
すぐ上のデータと同じものをコピーする場合、
Ctrlキーを押しながら、Dのキーを押してコピーします。
そして次に、
TABキーで右に移動。
また、Ctrlキー+Dキー押下
またTABキーで右に移動
個数を入力してまたTABキーで右に移動します。
すると数式は自動でコピーされます。
 
それから、
 
>となるようにしたいです。できれば書式というか、フォントやいろ継承させたいです
↑これは、列丸ごと事前に設定しておけばよいですよね?
 
>オートフィルではなく、値を計算式を挿入させたいですトートフィルでは=A1などの
>値になるので並べ替えやピボットテーブルで
>おかしくなったことがあるので正確性を考慮してのことです

↑これは「絶対参照と相対参照」をうまく使い分けると避けられる問題ではないでしょうか?
https://www.becoolusers.com/excel/absolute-references.html
https://support.office.com/ja-jp/article/相対参照、絶対参照、複合参照を切り替える-dfec08cd-ae65-4f56-839e-5f0d8d0baca9
 
次に、
>また、オートフィルだと最終行にくるたびにドラッグする必要があるのも手間がかかっています
↑これは、「テーブル」という機能を使ってみてください。
基本的にUUUさんの希望はこれで満足されるはずです。
 
あぁ、正確に言うと満足できないかも知れませんが、
妥協して満足してください。
 
エクセルを自分用にカスタマイズするのは結構難しい話になりますし、
マクロを使うと「元に戻す」機能が使えなくなるのですごく不利です。
(正確に言うと操作の履歴がクリアされるので元に戻せなくなります)
 
※見た目は後で好きなように変えられるので、
とりあえず「テーブルとして書式設定」というのをやってみることをお勧めします。
好みの書式が無くて使ってない人多いと思うので、
テーブルにだけできるアイコンがあればいいと思うのだが。。。。。
(ほんとはどこかに隠れているのかな^^^;)

回答
投稿日時: 18/04/01 17:39:49
投稿者: もこな2

UUU さんの引用:
とあるとき、個数に何かを入力したら
2行目の日付には直前の日付、担当者IDのも直前の値
金額には個数×100
フォントや配色なども同じにしたいです
とりあえず、"直前の”っていうのは1行前のって解釈でいいんですかね?そうであるなら、やはりchangeイベントで簡単に処理できませんか?
私の投稿にコメントがないけど理解できないから無視したのか、現在検討中なのかよくわからず。
 
UUU さんの引用:
また、個数の修正時には、金額のみが上書きされるようにしたです
changeイベントを検討してここでつまったんでしょうか?
逆に考えて、修正であろうと新規入力だろうと、ともかくC列の値が変更されたら1行前の値や書式をコピペ、10倍にしてD列の値に設定するって方法じゃだめですか?
 
UUU さんの引用:
オートフィルではなく値や計算式を挿入したいです
オートフィルではコピペや並べ替えやピポッドテーブルのときにずれることがあるので
それを考慮してのことです
また。オートフィルでは最終行に来るたびに適宜ドラッグする必要があるのも手間です
オートフィルでどういう操作をしようとしたのかよくわからず。特に、
・特にずれるって何がずれるんだろう?
・最終行に来るたびに適宜ドラッグってどういう意味だろう?
というところが疑問におもうので、逆にどういう操作をしてダメだったのか教えてほしいです。

投稿日時: 18/04/01 17:47:32
投稿者: UUU

mattuwan44 さんとても親切に書き起こして頂いてたすかりました
ありがとうございます
 
 
実は、テーブル機能は仕様しておりました
”データ範囲の形式及び数式を拡張する” にて計算式は自動で入力されますが
日付は計算式ではないので自動で入力はされません
 
アドバイスのショートカットですが、データは一日に100個ほどあるので、すべてに適応させるのも
なかなか困難な気がいたします
それならば、まだドラッグの方が楽かな、と(これは、マウスに持ち替えたり画面をスクロール、戻す、というのが最大の手間です)
 
日付が計算式だと困るのは、削除したときにあやまって被参照セルを削除してしまった場合ですね
気づかずに集計してしまったりして大変なミスになったりしそうです(実際にやったことあります)
 
accessのように直前の値を参照、があればよいのですが

投稿日時: 18/04/01 17:52:29
投稿者: UUU

もこな2さん
直前のというのは1つ前の行という意味です
 
changeイベントについて、調べて勉強中でした
 
オートフィルでの操作は、日付または担当者IDが変わるときにそれらを手入力して、
とりあえず個数を100行ほど入力(日付などは空欄のまま)
スクロールして画面を戻して、日付を担当者IDをドラッグしてコピーということです

回答
投稿日時: 18/04/01 18:45:53
投稿者: もこな2

UUU さんの引用:
オートフィルでの操作は、日付または担当者IDが変わるときにそれらを手入力して、
とりあえず個数を100行ほど入力(日付などは空欄のまま)
スクロールして画面を戻して、日付を担当者IDをドラッグしてコピーということです
いまだに(個数の入力とどう関係するのか)ピンときませんが、とりあえずmattuwan44さんが転記してくださった表を見る限りこうでよいのでは?
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim buf As Range, MyRNG As Range
        
    Set buf = Intersect(Range(Rows(3), Rows(Rows.Count)), Columns("C"), Target)
    If buf Is Nothing Then Exit Sub
        
    For Each MyRNG In buf
        If IsNumeric(MyRNG.Value) And MyRNG.Value <> "" Then
            With Range(Cells(MyRNG.Row, "A"), Cells(MyRNG.Row, "B"))
                .Offset(-1).Copy .Cells
            End With
            MyRNG.Offset(, 1).Value = MyRNG.Value * 100
        End If
    Next MyRNG
End Sub

回答
投稿日時: 18/04/01 19:46:55
投稿者: simple

念のため、質問者さんに確認します。
 
個数入力がされ、その時に、その行の
日付と担当者IDについて、それらが空白ならば、
前行の値を増幅する、
ということじゃないですか?

投稿日時: 18/04/01 22:20:07
投稿者: UUU

simpleさん
 
はいそういうことです

回答
投稿日時: 18/04/01 22:29:30
投稿者: simple

そういうことだそうだが、そうは書いてありませんよ。
提示されたコードに修正されれば、よいのではないですか?
説明が必要ならその旨発言するとか、前に進めるようにしてはいかがですか?

投稿日時: 18/04/02 00:43:37
投稿者: UUU

simple さんの引用:
そういうことだそうだが、そうは書いてありませんよ。
提示されたコードに修正されれば、よいのではないですか?
説明が必要ならその旨発言するとか、前に進めるようにしてはいかがですか?

 
2行目の日付には直前の日付、担当者IDのも直前の値
金額には個数×100
フォントや配色なども同じにしたいです
 
と書いていますが…

投稿日時: 18/04/02 00:51:00
投稿者: UUU

simpleさん
せっかくですけど、回答してくださらなくて結構です
 
わけのわからない難癖をつけてレスされても不愉快なだけです
しかも、それが自身の読解力のなさからくるものであり、
回答をもったいぶっているような態度も不快です
 
お互いのためにもならないので、お互いコメントすることをやめましょう

投稿日時: 18/04/02 00:52:55
投稿者: UUU

あとやたら自治ってるのも気持ち悪さを感じます

回答
投稿日時: 18/04/02 01:51:02
投稿者: VBA-stepup

私の理解した範囲ですが
 

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Application.EnableEvents = False
    
    Select Case Target.Column
        Case "1"
            Target.Offset(0, 1).Select
        Case "2"
            Target.Offset(0, 1).Select
        Case "3"
            Target.Offset(0, 1).Value = Target.Value * 100
            If Target.Offset(0, -2).Value = "" Then
                Target.Offset(0, -2).Value = Target.Offset(-1, -2).Value
            End If
            If Target.Offset(0, -1).Value = "" Then
                Target.Offset(0, -1).Value = Target.Offset(-1, -1).Value
            End If
    End Select
    
    Application.EnableEvents = True
    
End Sub


 
違っていたらスルーして下さい。

投稿日時: 18/04/02 02:00:08
投稿者: UUU

回答して頂いたみなさまありがとうございました
 
みなさまから教えて頂いたVBAや設定を参考にして、
目的を達成することができました
 
大変参考になりました