Страницы: 1
RSS
Замена цифр на уникальные, Возможная автозамена одинаковых цифр в числе на уникальные в ячейке
 
Добрый день уважаемые форумчане,

Имеется число в ячейке 3-6 значные суммы, и нужно заменить цифры в ней на уникальные, т.е если 344 то на 345 или 354 итд. Скажите можно ли как нибудь настроить автозамену или же хоть как нибудь ещё упростить задачу. Спасибо
Кстати не трогая первую цифру
 
В модуль листа.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count = 1 Then
        Dim dic As Object
        Set dic = CreateObject("Scripting.Dictionary")
        Dim sTarget As String
        Dim ss As String
        Dim sAdd As String
        Dim sRes As String
        sTarget = Target.Value
        Dim flag As Boolean
        Dim xx As Long
        Dim ii As Long
        For xx = 1 To Len(sTarget)
            ss = Mid(sTarget, xx, 1)
            If IsNumeric(ss) Then
                sAdd = ss
                If flag Then
                    If dic.Exists(ss) Then
                        For ii = Int(ss) + 1 To 9
                            If Not dic.Exists(CStr(ii)) Then
                                sAdd = CStr(ii)
                                Exit For
                            End If
                        Next
                        If sAdd = ss Then
                            For ii = Int(ss) - 1 To 0 Step -1
                                If Not dic.Exists(CStr(ii)) Then
                                    sAdd = CStr(ii)
                                    Exit For
                                End If
                            Next
                        End If
                    End If
                Else
                    flag = True
                End If
                sRes = sRes & sAdd
                dic.Item(sAdd) = 0
            End If
        Next
        Application.EnableEvents = False
        Target = sRes
        Application.EnableEvents = True
    End If
End Sub
 
Спасибо огромное
 
Бьюсь все но не получается запустить, можете ли вставить в файл-пример или немного подсказать как правильно пожалуйста.
Изменено: Нурсултан Зулпукаров - 06.10.2022 20:17:09
 
Нурсултан Зулпукаров, здравствуйте
А можно узнать, для чего это сильнейшее колдунство нужно? Не смог и близко придумать ни одного практического применения…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack здравствуйте,
Практическое применение увы, но есть. Все что могу сказать это то что создаю рандом в большом объёме и потом нужно корректировать согласно задаче указанной выше.
 
Нурсултан Зулпукаров, яснее не стало, даже наоборот)
Ну да ладно
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Думаю, не в этом случае. Но чисто теоретическим может пригодится в случае, когда, например, клеят номера на оборудование. И для уменьшения неравномерности расхода, убирают повторяющиеся цифры.

PS А Нурсултан Зулпукаров очень своеобразно переформулировал в сообщении #6 фразу "не скажу" )
 
МатросНаЗебре, с "не скажу" согласен, а с вариантом использования — не понял или не согласен  :D
Изменено: Jack Famous - 07.10.2022 11:42:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
Sub ChangeDigit()
  Dim a, b&, c&, d&(), e&(), i&, r&, s
  Randomize
  a = [a1].CurrentRegion
  For r = 1 To UBound(a)
    ReDim d(0 To 9): s = Replace("" & a(r, 1), ",", "."): ReDim e(1 To Len(s))
    For i = 1 To Len(s)
      If Mid(s, i, 1) <> "." Then
        c = Val(Mid(s, i, 1)): If d(c) = 1 Then e(i) = 1 Else d(c) = 1
      End If
    Next
    For i = 2 To Len(s)
      If e(i) Then
        Do: b = Int(Rnd * 10): Loop Until d(b) = 0
        d(b) = 1: Mid(s, i, 1) = b
      End If
    Next
    a(r, 1) = Val(s)
  Next
  [b1].Resize(UBound(a), 1) = a
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Эврика работает!

Относительно применения: есть сумма, дроблю на рандом, остальное оставлю на фантазию.
Всем огромное спасибо и мира над головой!
 
спасибо!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх